如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby 在保留多个聚合的组内排序

Pandas 变量在组内移动

如何在R中的组内排名?

Pandas - 创建具有唯一值的组

如何在 Python 中的组内排名?

在 Python Pandas 中使用 cumsum 和 groupby 并在值为 0 时重置 cumsum