2017-02-18 4 views
1

Ich habe eine Reihe von Daten in Pandas, die von zwei Faktoren gruppiert wurde, so dass ich über die Gruppen getrennt summieren konnte. Mit anderen Worten:aggregieren eine Ebene von gruppierten Daten in Pandas

grouped = df.groupby(['A','B'])['C'].sum()

Nun würde Ich mag die std diese Summe nehmen „across“ B so kann ich sehen, wie diese Abweichung Änderungen für die verschiedenen A Werte. Wie kann ich diese Aggregationsoperation über eine "Dimension" oder einen "Index" der gruppierten Daten durchführen?

Ich bin neu in Pandas, also kann das einfach sein ... aber danke für die Hilfe!

Antwort

0

Es scheint, Sie müssen groupby mit Parameter level:

grouped = df.groupby(['A','B'])['C'].sum().groupby(level='B').std() 

Probe:

np.random.seed(100) 
df = pd.DataFrame(np.random.randint(5, size=(10,3)), columns=list('ABC')) 
print (df) 
    A B C 
0 0 0 3 
1 0 2 4 
2 2 2 2 
3 2 1 0 
4 0 4 3 
5 4 2 0 
6 3 1 2 
7 3 4 4 
8 1 3 4 
9 4 3 3 

grouped = df.groupby(['A','B'])['C'].sum().groupby(level='B').std().reset_index() 
print (grouped) 
    B   C 
0 0  NaN 
1 1 1.414214 
2 2 2.000000 
3 3 0.707107 
4 4 0.707107 

grouped = df.groupby(['A','B'])['C'].sum().groupby(level=1).std().reset_index() 
print (grouped) 
    B   C 
0 0  NaN 
1 1 1.414214 
2 2 2.000000 
3 3 0.707107 
4 4 0.707107 

Erklärung, per partes:

#groupby by columns A, B, aggregate column C 
#->output is Series with MultiIndex 
grouped1 = df.groupby(['A','B'])['C'].sum() 
print (grouped1) 
A B 
0 0 3 
    2 4 
    4 3 
1 3 4 
2 1 0 
    2 2 
3 1 2 
    4 4 
4 2 0 
    3 3 
Name: C, dtype: int32 

print (type(grouped1)) 
<class 'pandas.core.series.Series'> 

print (grouped1.index) 
MultiIndex(levels=[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]], 
      labels=[[0, 0, 0, 1, 2, 2, 3, 3, 4, 4], [0, 2, 4, 3, 1, 2, 1, 4, 2, 3]], 
      names=['A', 'B']) 

#groupby by level B of MultiIndex 
#->output is Series with MultiIndex, so reset_index for df 
grouped = grouped1.groupby(level='B').std().reset_index() 
print (grouped) 
    B   C 
0 0  NaN 
1 1 1.414214 
2 2 2.000000 
3 3 0.707107 
4 4 0.707107 
#all together 
grouped = df.groupby(['A','B'])['C'].sum().groupby(level='B').std().reset_index() 
print (grouped) 
    B   C 
0 0  NaN 
1 1 1.414214 
2 2 2.000000 
3 3 0.707107 
4 4 0.707107 
+0

Danke, das funktioniert. Irgendeine Erklärung warum? – weymouth

+0

sicher, gib mir eine Sekunde. – jezrael

+0

Bitte überprüfen Sie meine letzte Bearbeitung, wenn etwas unklar, lass es mich wissen, ich versuche es zu erklären. – jezrael

Verwandte Themen