累计和
为了直接回答这个问题,cumsum 方法将产生所需的系列:
In [17]: df
Out[17]:
id x
0 a 0
1 a 1
2 a 2
3 b 3
4 b 4
5 b 5
In [18]: df.groupby('id').x.cumsum()
Out[18]:
0 0
1 1
2 3
3 3
4 7
5 12
Name: x, dtype: int64
每组熊猫滚动功能
更一般地说,任何滚动功能都可以按如下方式应用于每个组(使用@kekert 评论的新 .rolling 方法)。请注意,返回类型是多索引系列,这与以前(已弃用)的 pd.rolling_* 方法不同。
In [10]: df.groupby('id')['x'].rolling(2, min_periods=1).sum()
Out[10]:
id
a 0 0.00
1 1.00
2 3.00
b 3 3.00
4 7.00
5 9.00
Name: x, dtype: float64
要应用每组滚动功能并以原始数据帧顺序接收结果,应使用转换:
In [16]: df.groupby('id')['x'].transform(lambda s: s.rolling(2, min_periods=1).sum())
Out[16]:
0 0
1 1
2 3
3 3
4 7
5 9
Name: x, dtype: int64
不推荐使用的方法
作为参考,以下是现已弃用的 pandas.rolling_mean 的行为方式:
In [16]: df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
Out[16]:
0 0.0
1 0.5
2 1.5
3 3.0
4 3.5
5 4.5