我有以下数据帧:
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
我必须从“Heart”列中的“current row”中减去“previous row”,然后创建一个新的行
但是,有一些条件:
期望输出:
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)
然而,我面临两个问题:
有更聪明的方法吗?任何帮助都将不胜感激。谢谢
尝试:
输出
您可以通过^{} 与
.groupby()
和.transform()
一起执行,如下所示:详情:
(1)首先,我们确保日期列采用日期时间格式,而不是字符串:
如果日期列已采用日期时间格式,则可以跳过此步骤
(2)心率变化(组内)通过以下方式获得:
我们可以简单地在
.transform()
中使用'diff'
而不是使用pd.Series.diff
来实现相同的结果(3)通过以下条件检查时间线的连续性(下个月与否):
我们检查与前一日期(组内)的时间差,严格小于2个月,以确保它在下一个月。我们无法检查<;=自连续两个月开始的某个日期差起的1个月可以是32天。请注意,此检查也适用于年假(从12月到1月),其中,仅使用月份数字(从12到1)进行逻辑检查将给出错误的结果
(4)最后,我们在现有列} 得到新列:
HeartRate
上使用^{^{} 在其第一个参数中测试条件,并在条件为真时将行替换为其第二个参数中的值。当不满足条件时,它保留行的原始值。因此,实现我们有条件地替代价值观的目标
输出:
您可以尝试以下方法:
逻辑与其他答案相同,但表达方式不同
相关问题 更多 >
编程相关推荐