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

2024-05-23 14:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个长格式的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]

Tags: 患者idpatientdiagnosisk429o820r319s202
1条回答
网友
1楼 · 发布于 2024-05-23 14:17:51

这应该能奏效

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意味着我们将依赖左数据帧的键(这将是左数据帧的“患者ID”)。请记住,我们添加到原始数据帧,所以我们希望这个数据帧(左)是参考点。你知道吗

left_on是要用作合并的左数据帧索引键的列

right_index因为我们使用的是右数据帧的索引(grouped by dataframe)

相关问题 更多 >