web-dev-qa-db-ja.com

パンダのグループでcumsumを使用するにはどうすればよいですか?

私が持っています

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

valごとにいくつかのidを実行したいので、目的の出力は次のようになります。

  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

これは私が試したものです:

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

そして

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

これは私が得たエラーです:

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

transform を呼び出して cumsum 関数を渡し、その列を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

エラーに関しては、Series groupbyオブジェクトでcumsumを呼び出すことはできません。次に、列の名前を無意味なリストとして渡します。

したがって、これは機能します:

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