【问题标题】:Python: create new columns based on ordering (dates) of variablesPython:根据变量的排序(日期)创建新列
【发布时间】:2022-08-06 23:13:46
【问题描述】:
我有以下数据框:
df =
patient_id diagnosis_code diagnosis_date medication_name medication_date
1 Diabetes 2014-08-05 A 2017-12-15
2 Diabetes 2019-06-07 A 2014-03-12
3 Diabetes 2015-06-18 B 2017-11-08
3 Heart Failure 2018-12-25 B 2017-11-08
4 Diabetes 2014-08-11 A 2017-07-07
我想创建与诊断和药物发生顺序相对应的新列:
df_output =
patient_id State_1 State_2 State_3
1 Diabetes A NA
2 A Diabetes NA
3 Diabetes B Heart Failure
4 Diabetes A NA
理想情况下,我们会为每个 patient_id 设置一行,以及我们观察到的尽可能多的 Sates。任何帮助都超过了赞赏。
标签:
python
pandas
group-by
【解决方案1】:
您可以开始将diagnosis_date 和medication_date 转换为pd.to_datetime,如果它们还没有。这在后续步骤中按日期排序时很有用。连接两对列(诊断代码/日期或药物名称/日期),同时重命名列,以便concat 了解放置新行的位置。删除所有重复项并按仅剩下日期的列排序,然后按patient_id 分组。然后,对于创建的每个组,您可以将to_list() 应用于现在包含诊断代码和药物名称的单列。使用apply(pd.Series) 执行上一步,这样每个列表项将被放置在单个列中。作为最后一步,使用适当的名称重命名列。
import pandas as pd
df = pd.read_csv('sample.csv', sep='\s+')
print(df)
# if it is not already, convert to datetime
df['diagnosis_date'] = pd.to_datetime(df['diagnosis_date'])
df['medication_date'] = pd.to_datetime(df['medication_date'])
result = pd.concat(
[df[['patient_id', 'medication_name', 'medication_date']],
df[['patient_id', 'diagnosis_code', 'diagnosis_date']]
.set_axis(['patient_id','medication_name', 'medication_date'], axis=1)]
).reset_index(drop=True)
result = result.drop_duplicates().sort_values('medication_date')
g = result.groupby('patient_id')
df_out = g.apply(lambda x: x['medication_name'].to_list()).apply(pd.Series)
# fix column names
df_out.columns = [f'State_{i+1}' for i in df_out.columns]
print(df_out)
输出自df_out
State_1 State_2 State_3
patient_id
1 Diabetes A NaN
2 A Diabetes NaN
3 Diabetes B Heart_Failure
4 Diabetes A NaN