【问题标题】: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

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

有什么想法吗?

提前非常感谢:)

安迪

【问题讨论】:

    标签: python pandas time-series rolling-computation


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2019-04-11
        • 2021-06-27
        • 2021-02-12
        • 2016-02-20
        • 2021-04-24
        • 1970-01-01
        • 2018-07-30
        • 2021-07-22
        • 2017-02-06
        相关资源
        最近更新 更多