首页 > 解决方案 > 分组数据框的滚动操作

问题描述

我正在尝试对数据框进行滚动求和。数据框示例:

     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. 对于严重性 1:[48 + 48 + 47]
  2. 对于严重性 2:[89 + 69 + 62]
  3. 对于严重性 3:[5 + 1 + 1]
  4. 对于严重性 4:[1 + 0 + 1]

下一个操作将持续几天(cdateint):[20200512, 20200513, 20200514]

  1. 对于严重性 1:[48 + 47 + 50]
  2. 对于严重性 2:[69 + 62 + 44]
  3. 对于严重性 3:[1 + 1 + 2]
  4. 对于严重性 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}})

标签: pythonpandasrolling-computation

解决方案


IIUC,使用pandas.to_datetime和:groupbyrolling

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

推荐阅读