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!

20
demandé sur WalkingDeadFan 2014-07-27 15:25:56

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  
36
répondu chrisb 2014-07-27 12:10:29