首页 > 解决方案 > 如何仅在过去 365 天使用 group by 对 pandas 数据帧执行滚动求和

问题描述

尝试计算 p_id 上仅过去 365 天的滚动总和,创建一个包含此滚动总和的新列。具有新列的数据框应如下所示:

Date        p_id    points          roll_sum
                                
2016-07-29  57        11            11
2016-08-01  57        9             20
2017-01-12  57        5             25
2017-10-23  57        18            23
2018-03-03  57        0             18
2018-03-06  57        4             22
2019-03-16  57        3             3
1997-04-07  12        50            50
1997-04-09  12        32            82
1998-02-11  12        3             85
1998-05-12  12        0             3
1999-05-22  12        0             3
1999-05-29  12        15            18
2000-07-20  12        2             2
2002-10-27  12        17            19

使用它时出现错误“窗口必须是整数”:

df.groupby(['Date', 'p_id'])['points'].rolling('365D', min_periods=1).sum()

或这个:

df.reset_index(level=0).set_index('Date').groupby('p_id').points.rolling('365D').sum()

尝试在 SO 上搜索,得到了类似于我的答案,但它使用了 python 2.x 的冗余命令

可以使用代码重新创建数据框:

dates = ['2016-07-29',
'2016-08-01',
'2017-01-12',
'2017-10-23',
'2018-03-03',
'2018-03-06',
'2019-03-16',
'1997-04-07',
'1997-04-09',
'1998-02-11',
'1998-05-12',
'1999-05-22',
'1999-05-29',
'2000-07-20',
'2002-10-27']


pid = [57,57,57,57,57,57,57,12,12,12,12,12,12,12,12]

points = [11,9 ,5 ,18,0 ,4 ,3 ,50,32,3 ,0 ,0 ,15,2 ,17]

roll_sum = [11,20,25,23,18,22,3 ,50,82,85,3 ,3 ,18,2 ,19]

df = pd.DataFrame({'Date': dates,
            'p_id': pid,
            'points':points,
            'roll_sum':roll_sum})

标签: pythonpandas

解决方案


set_index在匹配列上使用并join返回rolling结果:

s = df.set_index("Date").groupby('p_id')['points'].rolling('365D', min_periods=1).sum()

print (df.set_index(["p_id","Date"]).join(s, rsuffix="_rolling"))

                 points  roll_sum  points_rolling
p_id Date                                        
57   2016-07-29      11        11            11.0
     2016-08-01       9        20            20.0
     2017-01-12       5        25            25.0
     2017-10-23      18        23            23.0
     2018-03-03       0        18            18.0
     2018-03-06       4        22            22.0
     2019-03-16       3         3             3.0
12   1997-04-07      50        50            50.0
     1997-04-09      32        82            82.0
     1998-02-11       3        85            85.0
     1998-05-12       0         3             3.0
     1999-05-22       0         3             0.0
     1999-05-29      15        18            15.0
     2000-07-20       2         2             2.0
     2002-10-27      17        19            17.0

推荐阅读