【发布时间】:2021-07-29 10:05:19
【问题描述】:
我有以下数据框:
Disease HeartRate State MonthStart MonthEnd
Covid 89 Texas 2020-02-28 2020-03-31
Covid 91 Texas 2020-03-31 2020-04-30
Covid 87 Texas 2020-07-31 2020-08-30
Cancer 90 Texas 2020-02-28 2020-03-31
Cancer 88 Florida 2020-03-31 2020-04-30
Covid 89 Florida 2020-02-28 2020-03-31
Covid 87 Florida 2020-03-31 2020-04-30
Flu 90 Florida 2020-02-28 2020-03-31
我必须从“心脏”列中的“当前行”中减去“上一行”并创建一个新行。
但是,有一些条件:
- 仅当“疾病”和“状态”列的值相同时才会减去行值。
- 仅当行在连续月份时才会减去行值。如果时间线有中断,则不会减去值。
- 如果没有要减去的前行值,则仅输入“HeartRate”值。
期望的输出:
Disease HeartRate State MonthStart MonthEnd HeartRateDiff
Covid 89 Texas 2020-02-28 2020-03-31 89
Covid 91 Texas 2020-03-31 2020-04-30 2
Covid 87 Texas 2020-07-31 2020-08-30 87
Cancer 90 Texas 2020-02-28 2020-03-31 90
Cancer 88 Florida 2020-03-31 2020-04-30 88
Covid 89 Florida 2020-02-28 2020-03-31 89
Covid 87 Florida 2020-03-31 2020-04-30 -2
Flu 90 Florida 2020-02-28 2020-03-31 90
我知道如何使用以下代码从当前行中减去前一行:
df[‘DiffHeartRate’] = df.groupby(['Disease', 'State'])['HeartRate'].transform(pd.Series.diff)
但是,我面临两个问题:
- 如果没有前一行要减去,则保持相同的值。
- 检查时间线的连续性(下个月与否)。
有没有更聪明的方法?任何帮助,将不胜感激。谢谢!
【问题讨论】:
-
这是一个奇怪的操作。此外,您的日期看起来不正常
-
你考虑过年假的情况吗?在示例数据中添加 2 行:
Covid 92 Texas 2020-12-31 2020-01-31和Covid 93 Texas 2021-01-31 2021-02-28。这 2 行是连续的几个月,应该显示HearRateDiffof1。然后,您可以查看哪些解决方案给出了正确的结果。 -
实际上,使用 2 个月数(例如 1 表示 1 月,12 表示 12 月)检查连续月份的解决方案相差 1 将根本无法处理年假(月份数从 12 变为 1 ) 并给出错误的结果。
-
这是一个很好的观察@SeaBean。谢谢你的告知。非常感激。但是,请您看一下这个问题:stackoverflow.com/questions/67453646/…
标签: python pandas dataframe time-series