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

时间:2018-11-08 03:07:22

标签: python pandas performance numpy-ndarray

我有6个通过ID密钥链接的熊猫数据帧(患者,Test1,Test2,Test3,Test4,Test5)。

“患者”数据框中的每一行代表一个包含唯一ID的患者,共有200000+患者/行。

“测试”数据框中的每一行代表一天的测试结果。测试数据帧的列是ID,DATE,TEST_UNIT,TEST_RESULT。每个测试数据帧包含6,000,000至7,000,000行。

我想遍历Patients数据框中的所有ID,并在每次迭代中使用该ID从5个Test数据框中的每一个提取相关的测试数据,并对它们进行一些处理。

如果我愿意

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 个答案:

答案 0 :(得分:0)

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

无论如何,您当前的代码将必须将所有数据帧保存在内存中。这是低效的。例如,查看generator functions

1。创建所有ID的列表

Objects

2。创建一个主数据框

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

3。创建生成器功能以生成特定于患者的数据框以进行进一步处理

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