python - 如何仅在过去 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})
解决方案
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
推荐阅读
- sql - 使用 group by 从表中选择最后一条记录
- python - Numpy 无法在 Windows 命令窗口中加载。Python 版本 3.7.1
- r - 如何在一张图上绘制 1000 个点,不同的点用不同的颜色?
- python - 状态转换从 python 线程工作
- android - Ionic firebase 指定 google-services.json
- android - Android RecyclerView 使用 Firebase 实时数据库的多个过滤器
- shell - 脚本只会为我的案例生成报告,但不会为我的 If Else
- sql - FileMaker 17 小结值
- python - 我怎样才能摆脱 CondaUpgradeError “需要更新版本的 conda。”?
- c# - Python 请求/cURL 到 C# POST 请求