从Pandas数据帧中有效提取数据子集



我有6个熊猫数据帧(Patients、Test1、Test2、Test3、Test4、Test5(通过ID键链接。

患者数据帧中的每一行代表一个包含唯一ID的患者,每行有200000多名患者。

测试数据帧中的每一行表示一天的测试结果。测试数据帧的列为ID、DATE、Test_UNIT、Test_RESULT。每个测试数据帧包含6000000到7000000行。

我想循环浏览Patients数据帧中的所有ID,并在每次迭代中使用该ID从5个测试数据帧中提取相关的测试数据,并对其进行一些处理。

如果我做

for i in range(len(Patients)):
ind_id = Patients.ID.iloc[i]
ind_test1 = Test1[Test1['ID'] == ind_id]
ind_test2 = Test2[Test2['ID'] == ind_id]
ind_test3 = Test3[Test3['ID'] == ind_id]
ind_test4 = Test4[Test4['ID'] == ind_id]
ind_test3 = Test5[Test5['ID'] == ind_id]

每次迭代大约需要3.6秒。

当我试图通过使用Numpy接口来加快速度时。

Patients_v = Patients.values
Test1_v = Test1.values
Test2_v = Test2.values
Test3_v = Test3.values
Test4_v = Test4.values
Test5_v = Test5.values
for i in range(len(Patients_v)): 
ind_id = Patients_v[i, ID_idx]
ind_test1 = Test1_v[Test1_v[:, 0] == ind_id]
ind_test2 = Test2_v[Test2_v[:, 0] == ind_id] 
ind_test3 = Test3_v[Test3_v[:, 0] == ind_id] 
ind_test4 = Test4_v[Test4_v[:, 0] == ind_id] 
ind_test5 = Test5_v[Test5_v[:, 0] == ind_id]  

每次迭代大约需要0.9秒。

我该如何加快速度?

谢谢

不清楚您想要什么输出。我们只能假设您想要特定于患者的数据帧。

在任何情况下,您当前的代码都必须将所有数据帧保存在内存中。这是低效的。例如,看看生成器函数:

1.创建所有ID的列表

ALL_IDS = Patients.IDs.tolist()                        # Assuming all you need is the ID

2.创建主数据帧

ALL_DFS = [Test1, Test2, Test3, Test4, Test5]
df_master = pd.concat(ALL_DFS)

3.创建生成器函数,生成患者特定的数据帧以供进一步处理

def patient_slices(ALL_IDS):                           # Generator
for ID in ALL_IDS:
df_slice = df_master[df_master.ID == ID]
yield df_slice
df_slice = patient_slices(ALL_IDS)                      
for _ in xrange(len(ALL_IDS)):                         # Call the generator n times
sinlge_patient = next(df_slice)                    # Next patient for every call    
your_processing(sinlge_patient)                    # Do your magic

最新更新