【问题标题】:Extracting subset of data efficiently from Pandas Dataframe从 Pandas Dataframe 中有效地提取数据子集
【发布时间】:2018-11-08 03:07:22
【问题描述】:

我有 6 个由 ID 键链接的 pandas 数据帧(Patients、Test1、Test2、Test3、Test4、Test5)。

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

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

我想遍历患者数据帧中的所有 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 秒。

如何加快速度?

谢谢

【问题讨论】:

    标签: python pandas performance numpy-ndarray


    【解决方案1】:

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2019-04-25
      • 2012-10-05
      • 2019-02-03
      • 2016-07-14
      • 1970-01-01
      • 2022-01-27
      • 2018-02-07
      • 2014-12-09
      相关资源
      最近更新 更多