从 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 中的滚动总和中获取原始值的主要内容,如果未能解决你的问题,请参考以下文章