2015-09-29 12 views
5

HoCome posso usare cumsum all'interno di un gruppo in Pandas?

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 

mi piacerebbe far funzionare alcuni dei val per ogni id, quindi l'uscita desiderata simile a questo:

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 

Questo è quello che ho cercato:

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

e

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

Questo è l'errore che ho ottenuto:

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

risposta

8

È possibile chiamare transform e passare la funzione cumsum per aggiungere la colonna alla vostra df:

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 

Per quanto riguarda il vostro errore, si puo' t chiama cumsum su un oggetto groupby Series, in secondo luogo si passa il nome della colonna come una lista priva di significato.

Così funziona:

+0

ha, quindi passavo l'arg 'val' nel posto sbagliato. –

+0

È importante notare che 'df.groupby ('id') ['val']' è zucchero sintattico per 'df ['val']. Groupby ('id')' quando si esegue 'df.groupby ('id ') 'è un df groupby mentre i primi sono raggruppati in serie – EdChum

Problemi correlati