熊猫滚动总和分别乘以值

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 - 滚动总和

带有groupby的熊猫数据框滚动窗口

具有时间偏移熊猫的滚动平均值

类别值被替换/更新的滚动总和

从 Pandas DataFrame 中的滚动总和中获取原始值

为啥熊猫滚动意味着居中窗口