python - 分组数据框的滚动操作
问题描述
我正在尝试对数据框进行滚动求和。数据框示例:
cdateint severity cnt_alerts
0 20200511 1 48
1 20200511 2 89
2 20200511 3 5
3 20200511 4 1
4 20200512 1 48
5 20200512 2 69
6 20200512 3 1
7 20200512 4 0
8 20200513 1 47
9 20200513 2 62
10 20200513 3 1
11 20200513 4 1
12 20200514 1 50
13 20200514 2 44
14 20200514 3 2
15 20200514 4 4
16 20200515 1 48
17 20200515 2 44
18 20200515 3 6
19 20200515 4 5
20 20200516 1 47
21 20200516 2 23
22 20200516 3 0
23 20200516 4 1
24 20200517 1 48
25 20200517 2 14
26 20200517 3 1
27 20200517 4 0
所以我想滚动,说每 1 天一次 3 天,然后得到cnt_alerts
每个严重程度的总和。这意味着第一个操作将在几天内完成 (cdateint): [20200511, 20200512, 20200513]并且结果应该是:
- 对于严重性 1:[48 + 48 + 47]
- 对于严重性 2:[89 + 69 + 62]
- 对于严重性 3:[5 + 1 + 1]
- 对于严重性 4:[1 + 0 + 1]
下一个操作将持续几天(cdateint):[20200512, 20200513, 20200514]
- 对于严重性 1:[48 + 47 + 50]
- 对于严重性 2:[69 + 62 + 44]
- 对于严重性 3:[1 + 1 + 2]
- 对于严重性 4:[0 + 1 + 4]
等等。
请注意,在所有日子里,都会有 4 个严重级别,并且它们总是按照您在上面的示例中看到的排序。
2020 年 6 月 25 日更新:
此外,我想获得cdateint
“标签”。即对于第一种情况,标签是20200511 - 20200513
数据
df = pd.DataFrame({'cdateint': {0: u'20200511', 1: u'20200511', 2: u'20200511', 3: u'20200511', 4: u'20200512', 5: u'20200512', 6: u'20200512', 7: u'20200512', 8: u'20200513', 9: u'20200513', 10: u'20200513', 11: u'20200513', 12: u'20200514', 13: u'20200514', 14: u'20200514', 15: u'20200514', 16: u'20200515', 17: u'20200515', 18: u'20200515', 19: u'20200515', 20: u'20200516', 21: u'20200516', 22: u'20200516', 23: u'20200516', 24: u'20200517', 25: u'20200517', 26: u'20200517', 27: u'20200517'},
'cnt_alerts': {0: 48, 1: 89, 2: 5, 3: 1, 4: 48, 5: 69, 6: 1, 7: 0, 8: 47, 9: 62, 10: 1, 11: 1, 12: 50, 13: 44, 14: 2, 15: 4, 16: 48, 17: 44, 18: 6, 19: 5, 20: 47, 21: 23, 22: 0, 23: 1, 24: 48, 25: 14, 26: 1, 27: 0},
'severity': {0: 1, 1: 2, 2: 3, 3: 4, 4: 1, 5: 2, 6: 3, 7: 4, 8: 1, 9: 2, 10: 3, 11: 4, 12: 1, 13: 2, 14: 3, 15: 4, 16: 1, 17: 2, 18: 3, 19: 4, 20: 1, 21: 2, 22: 3, 23: 4, 24: 1, 25: 2, 26: 3, 27: 4}})
解决方案
IIUC,使用pandas.to_datetime
和:groupby
rolling
df["cdateint"] = pd.to_datetime(df["cdateint"].astype(str))
new_df = df.set_index("cdateint").groupby("severity").rolling("3d")["cnt_alerts"].sum()
new_df = new_df.reset_index()
print(new_df)
输出:
severity cdateint cnt_alerts
0 1 2020-05-11 48.0
1 1 2020-05-12 96.0
2 1 2020-05-13 143.0
3 1 2020-05-14 145.0
4 1 2020-05-15 145.0
5 1 2020-05-16 145.0
6 1 2020-05-17 143.0
7 2 2020-05-11 89.0
8 2 2020-05-12 158.0
9 2 2020-05-13 220.0
10 2 2020-05-14 175.0
11 2 2020-05-15 150.0
12 2 2020-05-16 111.0
13 2 2020-05-17 81.0
14 3 2020-05-11 5.0
15 3 2020-05-12 6.0
16 3 2020-05-13 7.0
17 3 2020-05-14 4.0
18 3 2020-05-15 9.0
19 3 2020-05-16 8.0
20 3 2020-05-17 7.0
21 4 2020-05-11 1.0
22 4 2020-05-12 1.0
23 4 2020-05-13 2.0
24 4 2020-05-14 5.0
25 4 2020-05-15 10.0
26 4 2020-05-16 10.0
27 4 2020-05-17 6.0
推荐阅读
- reactjs - 使用 DrawerNavigator 时 this.props.navigation.goback() 无法正常工作
- c++ - 从 boost binary_iarchive 读取的数据不正确
- agda - 表示同态而不写出所有定律
- git - 当提交已经合并时,将提交重新设置到 master
- python - 在python中,如何在不同对象之间共享(引用)一个变量作为属性?
- node.js - 使用文本输入上传文件的最佳方式
- angular - 模板解析错误:不是已知元素
- sql - 在 Select 语句中使 Oracle 条件可选
- angular - 使用 GraphQL 和 React 比使用 GraphQL 和 Vue/Ember/Angular 有什么好处吗?
- javascript - 如何在本地地址和网址/备用地址之间切换锚链接?