Pandas-GroupBy et ensuite fusionner sur la table originale
j'essaye d'écrire une fonction pour agréger et effectuer diverses calculs de stats sur une dataframe dans Pandas et ensuite la fusionner avec la dataframe originale cependant, je cours vers des problèmes. C'est l'équivalent de code en SQL:
SELECT EID,
PCODE,
SUM(PVALUE) AS PVALUE,
SUM(SQRT(SC*EXP(SC-1))) AS SC,
SUM(SI) AS SI,
SUM(EE) AS EE
INTO foo_bar_grp
FROM foo_bar
GROUP BY EID, PCODE
Et ensuite rejoindre sur la table d'origine:
SELECT *
FROM foo_bar_grp INNER JOIN
foo_bar ON foo_bar.EID = foo_bar_grp.EID
AND foo_bar.PCODE = foo_bar_grp.PCODE
Voici les étapes: Chargement des données DANS:>>
pol_dict = {'PID':[1,1,2,2],
'EID':[123,123,123,123],
'PCODE':['GU','GR','GU','GR'],
'PVALUE':[100,50,150,300],
'SI':[400,40,140,140],
'SC':[230,23,213,213],
'EE':[10000,10000,2000,30000],
}
pol_df = DataFrame(pol_dict)
pol_df
:>>
EID EE PCODE PID PVALUE SC SI
0 123 10000 GU 1 100 230 400
1 123 10000 GR 1 50 23 40
2 123 2000 GU 2 150 213 140
3 123 30000 GR 2 300 213 140
Étape 2: calculer et grouper sur le données:
Mes pandas code est comme suit:
#create aggregation dataframe
poagg_df = pol_df
del poagg_df['PID']
po_grouped_df = poagg_df.groupby(['EID','PCODE'])
#generate acc level aggregate
acc_df = po_grouped_df.agg({
'PVALUE' : np.sum,
'SI' : lambda x: np.sqrt(np.sum(x * np.exp(x-1))),
'SC' : np.sum,
'EE' : np.sum
})
Cela fonctionne très bien jusqu'à ce que je veux rejoindre sur la table d'origine:
DANS>>
po_account_df = pd.merge(acc_df, po_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po'))
:>> KeyError: u no point nommé EID'
pour une raison quelconque, le datagramme groupé ne peut pas rejoindre la table originale. J'ai cherché des moyens de convertir les colonnes groupby en colonnes réelles mais cela ne semble pas fonctionner.
Veuillez noter que l'objectif final est d'être capable de trouver le pourcentage pour chaque colonne (valeur, SI, SC, EE) IE:
pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4)
Merci!
1 réponses
Par défaut, groupby
sortie a les colonnes de regroupement indicies, pas de colonnes, c'est pourquoi la fusion est un échec.
il y a plusieurs façons de le gérer, probablement la plus facile est d'utiliser le as_index
paramètre lorsque vous définissez l'objet groupby.
po_grouped_df = poagg_df.groupby(['EID','PCODE'], as_index=False)
Ensuite, la fusion devrait fonctionner comme prévu.
In [356]: pd.merge(acc_df, pol_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po'))
Out[356]:
EID PCODE SC_Acc EE_Acc SI_Acc PVALUE_Acc EE_Po PVALUE_Po \
0 123 GR 236 40000 1.805222e+31 350 10000 50
1 123 GR 236 40000 1.805222e+31 350 30000 300
2 123 GU 443 12000 8.765549e+87 250 10000 100
3 123 GU 443 12000 8.765549e+87 250 2000 150
SC_Po SI_Po
0 23 40
1 213 140
2 230 400
3 213 140