熊猫滚动总和分别乘以值
Posted
技术标签:
【中文标题】熊猫滚动总和分别乘以值【英文标题】:Pandas rolling sum for multiply values separately 【发布时间】:2020-02-18 23:02:59 【问题描述】:我有以下数据框:
a = pd.DataFrame('unit': [2, 2, 3, 3, 3, 4, 4, 4, 5],
'date': [1, 2, 1, 2, 3, 1, 2, 3, 1],
'revenue': [1, 1, 3, 5, 7, 6, 6, 2, 9])
window = 2 的 Pandas rolling.sum:
a['rolled_sum'] = a.rolling(2, on='date').sum().shift(+1)['revenue']
逐行计算这个总和:
adunit date revenue rolled_sum
0 2 1 1 NaN
1 2 2 1 NaN
2 3 1 3 2.0
3 3 2 5 4.0
4 3 3 7 8.0
5 4 1 6 12.0
6 4 2 6 13.0
7 4 3 2 12.0
8 5 1 9 8.0
我想分别计算每个单元的滚动总和:
adunit date revenue rolled_sum
0 2 1 1 NaN
1 2 2 1 NaN
2 3 1 3 NaN
3 3 2 5 NaN
4 3 3 7 8.0
5 4 1 6 NaN
6 4 2 6 NaN
7 4 3 2 12.0
8 5 1 9 NaN
换句话说:应分别对每个单元执行滚动求和。 在我的原始数据集中,我有数百个单元,并且希望每天为每个单元执行滚动求和。
有什么想法吗?
提前非常感谢:)
安迪
【问题讨论】:
【参考方案1】:通过您的排序,您可以屏蔽不应设置的位置。
m = a.unit.eq(a.unit.shift()) & a.unit.eq(a.unit.shift(-1))
a['rolled_sum'] = (a.rolling(2, on='date').sum().shift(+1)['revenue']
.where(m.shift().fillna(False)))
unit date revenue rolled_sum
0 2 1 1 NaN
1 2 2 1 NaN
2 3 1 3 NaN
3 3 2 5 NaN
4 3 3 7 8.0
5 4 1 6 NaN
6 4 2 6 NaN
7 4 3 2 12.0
8 5 1 9 NaN
【讨论】:
【参考方案2】:IIUC,你可以在 groupby 上滚动:
a['rolled_sum'] = (a.groupby('unit')
.rolling(2, on='date').sum()['revenue']
.groupby('unit').shift(1)
.to_numpy()
)
输出:
unit date revenue rolled_sum
0 2 1 1 NaN
1 2 2 1 NaN
2 3 1 3 NaN
3 3 2 5 NaN
4 3 3 7 8.0
5 4 1 6 NaN
6 4 2 6 NaN
7 4 3 2 12.0
8 5 1 9 NaN
【讨论】:
以上是关于熊猫滚动总和分别乘以值的主要内容,如果未能解决你的问题,请参考以下文章
缺少日期的 Pandas Date MultiIndex - 滚动总和