2015-09-29 17 views
5

Ich habeWie kann ich Cumsum innerhalb einer Gruppe in Pandas verwenden?

df = pd.DataFrame.from_dict({'id': ['A', 'B', 'A', 'C', 'D', 'B', 'C'], 'val': [1,2,-3,1,5,6,-2], 'stuff':['12','23232','13','1234','3235','3236','732323']}) 

    id stuff val 
0 A  12 1 
1 B 23232 2 
2 A  13 -3 
3 C 1234 1 
4 D 3235 5 
5 B 3236 6 
6 C 732323 -2 

ich einige val für jeden id bekommen möchte laufen, so sieht die gewünschte Ausgabe wie folgt aus:

id stuff val cumsum 
0 A  12 1 1 
1 B 23232 2 2 
2 A  13 -3 -2 
3 C 1234 1 1 
4 D 3235 5 5 
5 B 3236 6 8 
6 C 732323 -2 -1 

Das ist, was ich versucht:

df['cumsum'] = df.groupby('id').cumsum(['val']) 

und

df['cumsum'] = df.groupby('id').cumsum(['val']) 
Diese

ist der Fehler, den ich bekam:

ValueError: Wrong number of items passed 0, placement implies 1 

Antwort

8

Sie können transform aufrufen und übergeben Sie die cumsum Funktion diese Spalte zu Ihrer df hinzuzufügen:

In [156]: 
df['cumsum'] = df.groupby('id')['val'].transform(pd.Series.cumsum) 
df 

Out[156]: 
    id stuff val cumsum 
0 A  12 1  1 
1 B 23232 2  2 
2 A  13 -3  -2 
3 C 1234 1  1 
4 D 3235 5  5 
5 B 3236 6  8 
6 C 732323 -2  -1 

In Bezug auf Ihre Fehler können Sie‘ t Rufen Sie cumsum auf einem Series groupby Objekt auf, zweitens übergeben Sie den Namen der Spalte als eine Liste, die bedeutungslos ist.

So funktioniert das:

+0

Verstanden, so dass ich das Bestehen der 'val' arg an der falschen Stelle. –

+0

Es ist wichtig zu beachten, dass 'df.groupby ('id') ['val']' syntaktischer Zucker für 'df ['val'] ist. Groupby ('id')' wenn du 'df.groupby ('id ') 'es ist ein df-groupby, während die ersteren serie groupby sind – EdChum

Verwandte Themen