J'ai
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
Je voudrais lancer une partie de val
pour chaque id
, donc la sortie souhaitée ressemble à ceci:
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
Voici ce que j'ai essayé:
df['cumsum'] = df.groupby('id').cumsum(['val'])
et
df['cumsum'] = df.groupby('id').cumsum(['val'])
Voici l'erreur que j'ai eue:
ValueError: Wrong number of items passed 0, placement implies 1
Vous pouvez appeler transform
et passer la fonction cumsum
pour ajouter cette colonne à votre 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
En ce qui concerne votre erreur, vous ne pouvez pas appeler cumsum
sur un objet Groupby Series, deuxièmement, vous passez le nom de la colonne sous forme de liste qui n'a pas de sens.
Donc ça marche:
In [159]:
df.groupby('id')['val'].cumsum()
Out[159]:
0 1
1 2
2 -2
3 1
4 5
5 8
6 -1
dtype: int64