根据 df1 中值的条件在 df2 中查找行的有效方法

Efficient way to find row in df2 based on condition from value in df1

我有两个数据框。 df1 有大约 31,000 行,而 df2 有大约 117,000 行。我想根据以下条件向 df1 添加一列。

(df1.id == df2.id) 和 (df2.min_value < df1.value <= df2.max_value)

我知道 df2 将 return 0 或 1 行满足 df1 中每个 id 值的条件。对于 df1 中的每一行,我想在满足上述条件时从 df2 添加一列。

我目前的代码如下。这是逐行的方法。

new_df1 = pd.DataFrame(columns = df1.columns.tolist()+[new_col])
for i, row in df1.iterrows():
    val = row['value']
    id = row['id']
    dummy = df2[(df2.id == id) & (df2.max_value >= val) & (df2.min_value < val)]
    if dummy.shape[0] == 0:
        new_col = np.nan
    else:
        new_col = dummy.new_column.values[0]
    l = len(new_df1)
    new_df1.loc[l] = row.tolist()+[new_col]

这是一种耗时的方法。有没有办法更有效地解决这个问题?

可以根据id列合并df1和df2:

merged_df = df1.merge(df2, on='id', how='left')

现在,如果 DF1 中的任何行的 ID 与 DF2 中某行的 ID 相匹配,则所有 DF2 列都将放在它旁边。然后,您可以根据给定条件简单地过滤合并的数据框:

merged_df.query('max_value > val and min_value < val')