2016-07-25 15 views
1

Ich habe einen Datenrahmen, den ich mit zwei Variablen gruppieren möchte, und führe dann die Berechnung innerhalb dieser Variablen durch. Gibt es eine einfache Möglichkeit, dies zu tun, und die Informationen zurück in einen Datenrahmen zu setzen, wenn ich fertig bin, das heißt wie folgt aus:Berechnungen auf Pandas DataFrame mit groupby durchführen und dann wieder an einen DataFrame übergeben?

df=pd.DataFrame({'A':[1,1,1,2,2,2,30,12,122,345], 
'B':[1,1,1,2,3,3,3,2,3,4], 
'C':[101,230,12,122,345,23,943,83,923,10]}) 

total = [] 
avg = [] 
AID = [] 
BID = [] 
for name, group in df.groupby(['A', 'B']): 
    total.append(group.C.sum()) 
    avg.append(group.C.sum()/group.C.nunique()) 
    AID.append(name[0]) 
    BID.append(name[1]) 

x = pd.DataFrame({'total':total,'avg':avg,'AID':AID,'BID':BID}) 

Aber offensichtlich viel effizienter?

Antwort

2

können Sie verwenden pandas Aggregatfunktion nach groupby:

import pandas as pd 
import numpy as np 
df.groupby(['A', 'B'])['C'].agg({'total': np.sum, 'avg': np.mean}).reset_index() 

#  A B total   avg 
# 0 1 1  343 114.333333 
# 1 2 2  122 122.000000 
# 2 2 3  368 184.000000 
# 3 12 2  83 83.000000 
# 4 30 3  943 943.000000 
# 5 122 3  923 923.000000 
# 6 345 4  10 10.000000 
+0

ich so das Gefühl, ist die Antwort, aber ich habe noch eine Frage - sagen wir, dass ‚avg‘ ist wirklich die Summe() dividiert durch die einzigartige Elemente in einer anderen Spalte - wie würde ich diese andere Spalte referenzieren. np.sum/np.unique (Gruppe ['andere_Spalte'])? Ist das sinnvoll? – user1566200

+0

Das würde ich wahrscheinlich in zwei Schritten machen. 'df1 = df.groupby (['A', 'B']) ['C'] .agg ({'Gesamt': np.sum}); df1 ['avg'] = df1.total/df.groupby(['A ',' B ']) [' ander ']. agg ({' num ': pd.Series.nunique}). num; df1.reset_index() 'so etwas wie das; – Psidom