【问题标题】: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_datemedication_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 2018-03-04
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多