如何在 Pandas 的组内使用 cumsum?
Posted
技术标签:
【中文标题】如何在 Pandas 的组内使用 cumsum?【英文标题】:How can I use cumsum within a group in Pandas? 【发布时间】:2015-12-27 03:49:48 【问题描述】:我有
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
我想为每个id
运行一些val
,因此所需的输出如下所示:
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
【问题讨论】:
【参考方案1】:您可以调用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
【讨论】:
嗨,对不起,两者有什么区别? “转换”是否更通用,您可以使用任何功能?以上是关于如何在 Pandas 的组内使用 cumsum?的主要内容,如果未能解决你的问题,请参考以下文章