pandas Python:基于变量的排序(日期)创建新列

mrphzbgm  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(153)

我有以下 Dataframe :

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都有一行,并且有多少个状态就有多少个观察结果。

umuewwlo

umuewwlo1#

如果尚未将diagnosis_datemedication_date转换为pd.to_datetime,则可以开始将它们转换为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

相关问题