web-dev-qa-db-fra.com

Comment puis-je utiliser cumsum au sein d'un groupe dans Pandas?

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
21
Baron Yugovich

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
34
EdChum