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

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

我有一个长格式的熊猫数据框(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]

这应该能奏效

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,但不存储将来的诊断。啊!我知道你想要什么了!拥有更多专业知识的人可能会比我做得更快。如果不是的话,我以后会处理。