Python:按日期顺序为患者数据创建状态列的技术需求
按日期排序生成患者状态列解决方案
原始数据构造
首先构造题目中的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'patient_id': [1, 2, 3, 3, 4], 'diagnosis_code': ['Diabetes', 'Diabetes', 'Diabetes', 'Heart Failure', 'Diabetes'], 'diagnosis_date': ['2014-08-05', '2019-06-07', '2015-06-18', '2018-12-25', '2014-08-11'], 'medication_name': ['A', 'A', 'B', 'B', 'A'], 'medication_date': ['2017-12-15', '2014-03-12', '2017-11-08', '2017-11-08', '2017-07-07'] }) # 转换日期列为datetime格式,确保排序准确 df['diagnosis_date'] = pd.to_datetime(df['diagnosis_date']) df['medication_date'] = pd.to_datetime(df['medication_date'])
处理步骤
- 拆分并合并事件:将诊断和用药拆分为独立的事件记录,统一列名后合并
# 提取诊断事件 diagnosis_events = df[['patient_id', 'diagnosis_code', 'diagnosis_date']].rename( columns={'diagnosis_code': 'state', 'diagnosis_date': 'event_date'} ) # 提取用药事件 medication_events = df[['patient_id', 'medication_name', 'medication_date']].rename( columns={'medication_name': 'state', 'medication_date': 'event_date'} ) # 合并所有事件并去重(同一患者同一状态同一日期仅保留一次) all_events = pd.concat([diagnosis_events, medication_events]).drop_duplicates()
- 排序并编号事件:按患者ID和事件日期排序,给每个患者的事件按顺序编号
# 按患者和日期升序排序 all_events_sorted = all_events.sort_values(['patient_id', 'event_date']) # 生成事件序号(从1开始) all_events_sorted['state_num'] = all_events_sorted.groupby('patient_id').cumcount() + 1
- 转宽表并格式化输出:将长格式数据转为宽格式,重命名列并填充缺失值
# 转宽表 df_output = all_events_sorted.pivot( index='patient_id', columns='state_num', values='state' ).rename(columns=lambda x: f'State_{x}').reset_index() # 填充缺失值为NA,匹配期望输出格式 df_output = df_output.fillna('NA')
最终输出
执行上述代码后,df_output结果如下:
patient_id State_1 State_2 State_3 0 1 Diabetes A NA 1 2 A Diabetes NA 2 3 Diabetes B Heart Failure 3 4 Diabetes A NA
内容的提问来源于stack exchange,提问作者Economist_Ayahuasca
相关产品推荐
相关产品推荐

