Python 将列中以前的所有字符串作为列表存储在数据框中新列的单元格中
我有一个长格式的熊猫数据框(10M+行),其中每行包括一次医院就诊和一次相应的诊断,任何患者都可以进行多次就诊 我想创建一个新专栏,总结该患者先前获得的所有独特诊断 创建一个包含列表的新列很简单,该列表总结了任何时候授予的所有诊断,但这对我来说并不适用Python 将列中以前的所有字符串作为列表存储在数据框中新列的单元格中,python,pandas,Python,Pandas,我有一个长格式的熊猫数据框(10M+行),其中每行包括一次医院就诊和一次相应的诊断,任何患者都可以进行多次就诊 我想创建一个新专栏,总结该患者先前获得的所有独特诊断 创建一个包含列表的新列很简单,该列表总结了任何时候授予的所有诊断,但这对我来说并不适用 What I tried so far: df.groupby( ["Patient_ID"] )["Diagnosis"].unique().to_frame(name = "all_diagnoses").reset_index() P
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]
这应该能奏效
df2 =df.groupby('Patient_ID')['Diagnosis'].unique().to_frame()
df.merge(df2, how = 'left', left_on = 'Patient_ID', right_index = True )
解释
我们先进行分组,然后在数据帧中转换序列
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\u index
因为我们使用的是正确数据帧的索引(按数据帧分组)感谢您的快速回复。您发布的代码运行,但只提供每个就诊ID的唯一诊断值。我想收集每个患者ID在当前就诊ID之前遇到的所有唯一诊断值,并将该列表存储在原始数据框的新列中。对不起,似乎我错误地将就诊ID
与患者ID
交换了,我将切换它们。请告诉我是否有效。我想它现在应该可以用了。再次感谢你,但它还是不起作用。代码生成的输出(在您更改代码后)在新列中记录每个患者ID的所有诊断(请参见上面“这不是我想要的”下的编辑)。我需要的是存储每个患者ID的所有诊断,直到(包括)当前就诊ID,但不存储将来的诊断。啊!我知道你想要什么了!拥有更多专业知识的人可能会比我做得更快。如果不是的话,我以后会处理。