我的任务是对来自 3 个不同表的数据进行建模,以适应机器学习模型
我正在观察 1300 名患者,他们正在服用药物、获取实验室结果并回应口头调查。信息每周记录一次,持续 24 周。
我的目标是将数据输入一个模型,该模型将预测药物疗效的结果。
数据以 3 个表格的形式提供给我。这是表格的样子
表1
患者ID | 周 | 药物治疗 | MG_剂量 |
---|---|---|---|
1 | 2 | 1.0 | 32 |
2 | 2 | 2.0 | 20 |
表2
患者ID | 周 | 测试1 | 测试2 |
---|---|---|---|
1 | 2 | 0.0 | 1.0 |
2 | 2 | 1.0 | 0.0 |
表3
患者ID | 周 | 调查Q1 | 调查第二季度 |
---|---|---|---|
1 | 2 | 1.0 | 0.0 |
2 | 2 | 0.0 | 1.0 |
我正在尝试构建数据,其中每个患者都在自己的列中,如下所示
临床数据 | 患者1 | 患者2 | 患者3 |
---|---|---|---|
第一周医学 | 1.0 | 2.0 | 1.0 |
第 1 周剂量 | 32 | 20 | 32 |
第 1 周测试 1 | 1.0 | 0.0 | 1.0 |
第 1 周测试 2 | 1.0 | 0.0 | 1.0 |
第一季度调查 | 1.0 | 0.0 | 1.0 |
第 1 周调查第 2 季度 | 0.0 | 1.0 | 0.0 |
第二周医学 | 1.0 | 2.0 | 1.0 |
第2周剂量 | 32 | 20 | 32 |
第二周测试1 | 1.0 | 0.0 | 1.0 |
第2周测试2 | 1.0 | 0.0 | 1.0 |
第 2 周调查第一季度 | 1.0 | 0.0 | 1.0 |
第 2 周调查第 2 季度 | 1.0 | 0.0 | 1.0 |
我最初尝试使用 pandas 中的 .join() 函数来聚合 3 个表中的数据。数据相对原始且未格式化。加入表格后,我的测试结果数量增加了 400%,所以数字完全不对。
我尝试将结果从行转向列;该表创建了一个嵌套索引,其中包含每种药物的 24 周表(见图),该索引太宽,无法用于分析。还有很多 nan 值很难在该结构中进行估算。
我正在研究一种解决方案来构建某种自动化,使用循环从 3 个不同的表中收集数据,并映射到列中的相应行。
我是一个Python新手用户,如果您对代码有任何见解,我将不胜感激。
干杯!
concat
+ stack
/unstack
:
tables = [Table_1, Table_2, Table_3]
out = (pd
.concat([t.set_index(['PatientID', 'Week']) for t in tables], axis=1)
.stack().unstack(level='PatientID').add_prefix('Patient ')
.pipe(lambda d: d.set_axis('Week'+d.index.get_level_values('Week').astype(str)
+' '+d.index.get_level_values(1))
)
.rename_axis(index='Clinical Data', columns=None).reset_index()
)
functools.reduce
+merge
和 melt
+pivot
:
from functools import reduce
tables = [Table_1, Table_2, Table_3]
out = (reduce(lambda a, b: a.merge(b, on=['PatientID', 'Week']), tables)
.melt(['PatientID', 'Week'])
.assign(**{'Clinical Data': lambda d: 'Week'+d.pop('Week').astype(str)
+' '+d.pop('variable')})
.pivot(index='Clinical Data', columns='PatientID', values='value')
.rename_axis(columns=None).reset_index()
)
输出:
Clinical Data Patient 1 Patient 2
0 Week2 Medication 1.0 2.0
1 Week2 MG_dose 32.0 20.0
2 Week2 Test 1 0.0 1.0
3 Week2 Test 2 1.0 0.0
4 Week2 Survey Q1 1.0 0.0
5 Week2 Survey Q2 0.0 1.0