繁体   English   中英

Pandas 滚动总和分别用于乘法值

[英]Pandas rolling sum for multiply values separately

我有以下 dataframe:

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]})

Pandas rolling.sum 与 window = 2:

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

换言之:应分别对每个单元进行滚动求和。 在我的原始数据集中,我有数百个单元,并且希望每天为每个单元执行滚动求和。

有任何想法吗?

提前谢谢了:)

安迪

IIUC,您可以在 groupby 上滚动:

a['rolled_sum'] = (a.groupby('unit')
                    .rolling(2, on='date').sum()['revenue']
                    .groupby('unit').shift(1)
                    .to_numpy()
                  )

Output:

   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

通过您的排序,您可以屏蔽不应该设置的位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM