【问题标题】:Fastest way to filter a pandas dataframe many times in a loop在循环中多次过滤熊猫数据帧的最快方法
【发布时间】:2021-02-25 15:43:12
【问题描述】:

我有一个包含 300 万行 (df1) 和另一个包含 10k 行 (df2) 的数据框。为 df2 中的每一行过滤 df1 的最快方法是什么?

这正是我需要在循环中做的事情:

for i in list(range(len(df2))): #For each row
    x = df1[(df1['column1'].isin([df2['info1'][i]])) \
          & (df1['column2'].isin([df2['info2'][i]])) \
          & (df1['column3'].isin([df2['info3'][i]]))]
    # ..... More code using x variable every time ......

此代码速度不够快,无法使用。

请注意,我使用了 .isin 函数,但其​​中始终只有一项。我发现使用 .isin() ,df1['column1'].isin([df2['info1'][i]] 比使用 df1['column1'] == df2['info1'][i] 更快。

【问题讨论】:

  • 我可能遗漏了什么,但df1["column1"].isin(df2["info1"]) 有什么问题?

标签: python pandas dataframe for-loop filter


【解决方案1】:
import pandas as pd
import numpy as np


def make_filter(x, y, match_dict, uinque=False):
    filter = None
    for x_key in x.columns:
        if x_key in match_dict:
            y_key = match_dict[x_key]
            y_col = y[y_key]
            if uinque:
                y_col = y_col.unique()
            col_filter = x[x_key].isin(y[y_key])
            if filter is None:
                filter = col_filter
            else:
                filter = filter & col_filter
    return filter


def main():
    n_rows = 100
    x = np.random.randint(4, size=(n_rows, 2))
    x = pd.DataFrame(x, columns=["col1", "col2"])
    y = np.random.randint(2, 4, size=(n_rows, 2))
    y = pd.DataFrame(y, columns=["info1", "info2"])

    match_dict = {"col1":"info1", "col2": "info2"}
    z = make_filter(x, y, match_dict, uinque=True)

    print(x[z])


main()

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2011-12-11
    • 2019-07-29
    • 2016-05-05
    相关资源
    最近更新 更多