我有
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,所以所需的输出如下所示:
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'])
和
这是我得到的错误:
ValueError: Wrong number of items passed 0, placement implies 1
您可以调用transform并传递cumsum函数以将该列添加到df中:
transform
cumsum
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
关于错误,您无法调用cumsumSeries groupby对象,其次,您将列名作为无意义的列表传递。
所以这有效:
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