从 Pandas DataFrame 中的滚动总和中获取原始值

Posted

技术标签:

【中文标题】从 Pandas DataFrame 中的滚动总和中获取原始值【英文标题】:Get original values from rolling sum in Pandas DataFrame 【发布时间】:2021-12-14 07:58:23 【问题描述】:

我得到了描述特定日期和地区新住院人数的数据。 住院人数为过去 7 天新增住院人数的滚动总和。 DataFrame 如下所示:

Date         Region      sum_of_last_7_days
01.01.2020   1           1
02.01.2020   1           2
03.01.2020   1           3
04.01.2020   1           4
05.01.2020   1           5
06.01.2020   1           6
07.01.2020   1           7
08.01.2020   1           7
09.01.2020   1           7
01.01.2020   2           1
02.01.2020   2           2
03.01.2020   2           3
04.01.2020   2           4
05.01.2020   2           5
06.01.2020   2           6
07.01.2020   2           7
08.01.2020   2           7
09.01.2020   2           7
10.01.2020   2           4

目标输出为:

Date         Region      daily_new
01.01.2020   1           1
02.01.2020   1           1
03.01.2020   1           1
04.01.2020   1           1
05.01.2020   1           1
06.01.2020   1           1
07.01.2020   1           1
08.01.2020   1           0
09.01.2020   1           0
01.01.2020   2           1
02.01.2020   2           1
03.01.2020   2           1
04.01.2020   2           1
05.01.2020   2           1
06.01.2020   2           1
07.01.2020   2           1
08.01.2020   2           0
09.01.2020   2           0
10.01.2020   2           0

方法应该是通过undo7天窗口的滚动求和操作,但我没有找到任何解决方案。

【问题讨论】:

你的输出不正确,如果cumsum是[…, 6, 7, 7, 7],那么输入是[…, x, 1, 0, 0] @mozway:您需要考虑到它是移动窗口上的总和,而不是标准的 cumsum。 【参考方案1】:

要获取原始值,请执行diff 并填写第一个值:

s = df.groupby('Region')['sum_of_last_7_days'].diff()
df['original'] = s.mask(s.isna(), df['sum_of_last_7_days'])

输出:

          Date  Region  sum_of_last_7_days  original
0   01.01.2020       1                   1       1.0
1   02.01.2020       1                   2       1.0
2   03.01.2020       1                   3       1.0
3   04.01.2020       1                   4       1.0
4   05.01.2020       1                   5       1.0
5   06.01.2020       1                   6       1.0
6   07.01.2020       1                   7       1.0
7   08.01.2020       1                   7       0.0
8   09.01.2020       1                   7       0.0
9   01.01.2020       2                   1       1.0
10  02.01.2020       2                   2       1.0
11  03.01.2020       2                   3       1.0
12  04.01.2020       2                   4       1.0
13  05.01.2020       2                   5       1.0
14  06.01.2020       2                   6       1.0
15  07.01.2020       2                   7       1.0
16  08.01.2020       2                   7       0.0
17  09.01.2020       2                   7       0.0

【讨论】:

我更正了目标输出。我认为,您的解决方案存在问题,因为当我们到达 f.e.区域 2 为 10.01.2020,其中 sum_of_last_7_days 4 (0+0+1+1+1+1),原始值应为零,但您得到 -3 (4-7),不是吗?

以上是关于从 Pandas DataFrame 中的滚动总和中获取原始值的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 中的滚动窗口生成值组合

Pandas:具有多个索引的滚动总和(即面板数据)

在 pandas DataFrame 中的滚动窗口上对数据进行排名

Pandas | 15 窗口函数

pandas DataFrame总和

为啥pandas.DataFrame.sum(axis=0) 在axis = 0代表行的每一列中返回值的总和?