将列中的所有先前字符串存储为pandas数据框中新列的单元格中的列表

时间:2017-05-12 19:18:57

标签: python pandas

我有一个长格式的pandas数据帧(10M +行),其中每行包括医院访问和相应的诊断,可以为任何患者进行多次访问。

我想创建一个新专栏,总结所有 以前为该患者颁发的唯一 诊断。

可以直接创建一个新列,其中包含一个列表,该列表总结了随时获得的所有诊断,但这不适合我。

What I tried so far:


df.groupby( ["Patient_ID"] )["Diagnosis"].unique().to_frame(name = "all_diagnoses").reset_index()

Patient_ID  all_diagnoses
2           [R104]
3           [O820, K429]
4           [R319, R339, N409, C619]
5           [J189, K578]
10          [C619, S202, R410]


Desired output:

Visit_ID  Patient_ID    ARRIVAL          Diagnosis      Newcol
52591     2             2/1/12 14:30     R104           [R104]
78131     3             4/26/12 7:00     O820           [O820]
78132     3             3/7/13 8:00      K429           [O820, K429]
61204     4             1/4/13 0:05      R319           [R319]
61202     4             1/10/13 15:00    R339           [R319, R339]
61205     4             4/23/13 10:00    N409           [R319, R339, N409]
61203     4             5/9/13 10:30     R319           [R319, R339, N409]
61206     4             5/30/13 3:40     C619           [R319, R339, N409, C619]
54263     5             3/28/12 23:10    J189           [J189]
54262     5             4/7/12 23:55     K578           [J189, K578]
111804    10            1/10/11 9:00     C619           [C619]
111803    10            5/16/12 20:00    S202           [C619, S202]
111805    10            7/18/12 14:30    R410           [C619, S202, R410]
82785     10            5/17/13 17:50    R410           [C619, S202, R410]
68737     10            11/28/13 10:30   R410           [C619, S202, R410]




This is not what I want:

Visit_ID  Patient_ID    ARRIVAL          Diagnosis      Newcol
52591     2             2/1/12 14:30     R104           [R104]
78131     3             4/26/12 7:00     O820           [O820, K429]
78132     3             3/7/13 8:00      K429           [O820, K429]
61204     4             1/4/13 0:05      R319           [R319, R339, N409, C619]
61202     4             1/10/13 15:00    R339           [R319, R339, N409, C619]
61205     4             4/23/13 10:00    N409           [R319, R339, N409, C619]
61203     4             5/9/13 10:30     R319           [R319, R339, N409, C619]
61206     4             5/30/13 3:40     C619           [R319, R339, N409, C619]
54263     5             3/28/12 23:10    J189           [J189, K578]
54262     5             4/7/12 23:55     K578           [J189, K578]
111804    10            1/10/11 9:00     C619           [C619, S202, R410]
111803    10            5/16/12 20:00    S202           [C619, S202, R410]
111805    10            7/18/12 14:30    R410           [C619, S202, R410]
82785     10            5/17/13 17:50    R410           [C619, S202, R410]
68737     10            11/28/13 10:30   R410           [C619, S202, R410]

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题

df2 =df.groupby('Patient_ID')['Diagnosis'].unique().to_frame()
df.merge(df2, how = 'left', left_on = 'Patient_ID', right_index = True )

说明

我们执行groupby,然后在数据框中转换系列。

df2 =df.groupby('Patient_ID')['Diagnosis'].unique().to_frame()

然后我们将原始数据帧与这个新数据帧合并;

 df.merge(df2, how = 'left', left_on = 'Patient_ID', right_index = True )

how = left表示我们将依赖左侧数据框的键(左侧数据帧的' Patient_ID')。请记住,我们添加到原始数据帧,因此我们希望此数据帧(左)为参考点。

left_on是我们想要用作合并左数据框的索引键的列

right_index因为我们正在使用正确数据框的索引(按数据框分组)