Python 使用什么代码交叉引用具有重复值的复杂数据集?
首先,对于非复杂用户提出的复杂问题表示抱歉。 我是一名医学研究人员,试图列出3个月内同时接受过CT扫描和X光检查的人员名单。我有两个excel/csv文档: (1) 是所有接受过CT扫描的人,有四个标题:参考号、日期、患者ID、患者姓名Python 使用什么代码交叉引用具有重复值的复杂数据集?,python,excel,database,pandas,Python,Excel,Database,Pandas,首先,对于非复杂用户提出的复杂问题表示抱歉。 我是一名医学研究人员,试图列出3个月内同时接受过CT扫描和X光检查的人员名单。我有两个excel/csv文档: (1) 是所有接受过CT扫描的人,有四个标题:参考号、日期、患者ID、患者姓名 (2) 是所有接受过X光检查并有四个:XR Ref,Date,Patient ID,Patient ID的人 在这两个优点中,只有参考文献是唯一的值,因为大多数人都有2个以上的研究,并且多个研究在同一天进行 我的目标是打印以下行:患者ID;患者姓名;CT_日期;
(2) 是所有接受过X光检查并有四个:XR Ref,Date,Patient ID,Patient ID的人 在这两个优点中,只有参考文献是唯一的值,因为大多数人都有2个以上的研究,并且多个研究在同一天进行 我的目标是打印以下行:患者ID;患者姓名;CT_日期;X光1号;X光2日;。。。X光检查(人们已经接受了多达10次X光检查)。任何关于使用技术的建议,无论多么普遍,都将是非常棒的 多谢各位 数据帧(1)(标题偏移以便于解释) (二) 预期产量
Patient_ID CT_Date XR1_Date XR2_Date XR3_date
0 12345 9/8/2019 9/10/2019 9/6/2018 9/16/2017
1 12346 9/6/2019
2 12347 9/6/2017 9/10/2016
3 12348 9/6/2016 9/10/2015
4 12348 9/8/2015 9/10/2015
(感谢@sammywemmy为您提供了询问更好问题的建议)将您的数据帧命名为
df1
naddf2
使用merge
和groupby
:
data = df1.merge(df2, left_on='Patient ID', right_on='Patient ID')
data = data.drop(['Ref_CT', 'X-Ray Ref', 'Patient Name_y'], axis=1)
data = data[['Patient ID', 'Patient Name_x', 'CT_Date', 'XR1_Date']]
data = data.groupby(['Patient ID', 'Patient Name_x'])[['CT_Date','XR1_Date']].agg(lambda x: list(set(x.values.tolist())))
输出:
您可以获得没有多列的紧凑数据。希望这是可以接受的输出
CT_Date XR1_Date
Patient ID Patient Name_x
12345 PersonA, Felix (Mr) [9/8/2019] [9/10/2017, 9/10/2019, 9/10/2018]
12347 PersonC, Trev (Mrs) [9/6/2017] [9/10/2016]
12348 PersonD, Jeremy (Mr) [9/6/2016, 9/8/2015] [9/10/2015]
请共享一个示例数据框,仅几行和您的预期输出。没有照片,只有数据。以此为指导:不用担心。注意到。。。在您的预期输出中,没有患者id 12346的行,似乎您将该数据与id 12345合并。这背后有什么原因吗?看起来至少有一名患者在x光和ct扫描之间改变了性别?哈哈哈,性别转换发生在我编数据点时,忘记了保持性别一致。我不小心漏掉了12346,因为一旦我可以生成这个数据框,我将使用excel删除没有两次扫描的患者,然后在相互扫描的3个月内过滤扫描。这很容易做到,但这种复杂的交叉引用无法在excel中完成,因此我迅速投入python
data = df1.merge(df2, left_on='Patient ID', right_on='Patient ID')
data = data.drop(['Ref_CT', 'X-Ray Ref', 'Patient Name_y'], axis=1)
data = data[['Patient ID', 'Patient Name_x', 'CT_Date', 'XR1_Date']]
data = data.groupby(['Patient ID', 'Patient Name_x'])[['CT_Date','XR1_Date']].agg(lambda x: list(set(x.values.tolist())))
CT_Date XR1_Date
Patient ID Patient Name_x
12345 PersonA, Felix (Mr) [9/8/2019] [9/10/2017, 9/10/2019, 9/10/2018]
12347 PersonC, Trev (Mrs) [9/6/2017] [9/10/2016]
12348 PersonD, Jeremy (Mr) [9/6/2016, 9/8/2015] [9/10/2015]