如何用Pandas计算每位患者各疗程的间隔天数?
解决患者疗程间天数差计算问题
步骤说明
要实现按患者分组计算相邻疗程的天数间隔,核心是按患者分组后对日期做滞后差值计算,具体步骤如下:
- 转换日期格式:先将字符串类型的
date列转为pandas的datetime格式,否则无法进行日期运算。 - 分组计算日期差:以
patient为分组键,对转换后的日期列使用diff()方法,该方法会自动计算当前行与前一行的日期差,新患者的第一行结果为NaN。 - 处理初始值:将每个患者的第一个疗程差值替换为0(或保留
NaN,根据需求调整),最后将差值转为整数类型。
完整代码实现
import pandas as pd # 原始数据集 df2 = pd.DataFrame({ 'patient': ['one', 'one', 'one', 'two','two', 'two'], 'treatment_schedule': ['treatment1', 'treatment2', 'treatment3', 'treatment1', 'treatment2', 'treatment3'], 'date': ['11/20/2022', '11/22/2022', '11/23/2022', '11/8/2022', '11/9/2022', '11/14/2022'] }) # 1. 转换日期列格式 df2['date'] = pd.to_datetime(df2['date'], format='%m/%d/%Y') # 2. 分组计算日期差,填充初始值为0 df2['lag_diff_days_between_each_treatment'] = df2.groupby('patient')['date'].diff().dt.days.fillna(0).astype(int) # 查看结果 print(df2)
输出结果
运行代码后得到的数据集与期望的df3完全一致:
patient treatment_schedule date lag_diff_days_between_each_treatment 0 one treatment1 2022-11-20 0 1 one treatment2 2022-11-22 2 2 one treatment3 2022-11-23 1 3 two treatment1 2022-11-08 0 4 two treatment2 2022-11-09 1 5 two treatment3 2022-11-14 5
补充说明
- 若希望第一个疗程的差值显示为
NaN而非0,只需去掉.fillna(0)即可。 - 确保疗程记录是按时间顺序排列的,如果原始数据存在乱序,需要先对每个患者的
date列排序:df2 = df2.sort_values(by=['patient', 'date']).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Murali
相关产品推荐
相关产品推荐

