首页 > 解决方案 > 如何根据对应于包含每个 ID 条件的第二个 Dataframe 的 ID 列有效地过滤 Dataframe?

问题描述

我有一个数据框,其中包含一个 ID 列和两个包含数值的数据列 X、Y。每个 ID 都有几行数据。

我有第二个数据框,它具有相同的 ID 列和两个数字列,指定 X 的下限和上限 - 每个 ID 的值。

我想使用第二个数据框来过滤第一个数据框,使其只有在特定 ID 的 X_min-X_max 范围内具有 X 值的行。

我可以通过遍历第二个数据帧并过滤 groupby(ID) - 第一个 DF 的元素来解决这个问题,但对于大量 ID 来说这很慢。有没有有效的方法来解决这个问题?

具有 df 中的数据、df_ranges 中的范围和 df_result 中的预期结果的示例代码。真实的数据帧显然要大得多。

import pandas as pd

x=[2.1,2.2,2.6,2.4,2.8,3.5,2.8,3.2]
y=[3.1,3.5,3.4,2.7,2.1,2.7,4.1,4.3]
ID=[0]*4+[0.1]*4
x_min=[2.0,3.0]
x_max=[2.5,3.4]
IDs=[0,0.1]
df=pd.DataFrame({'ID':ID,'X':x,'Y':y})
df_ranges=pd.DataFrame({'ID':IDs,'X_min':x_min,'X_max':x_max})
df_result=df.iloc[[0,1,3,7],:]

可能的解决方案:

def filter_ranges(grp,df_ranges):
    x_min=df_ranges.loc[df_ranges.ID==grp.name,'X_min'].values[0]
    x_max=df_ranges.loc[df_ranges.ID==grp.name,'X_max'].values[0]
    return grp.loc[(grp.X>=x_min)&(grp.X<=x_max),:]

target_df_grp=df.groupby('ID').apply(filter_ranges,df_ranges=df_ranges)

标签: pandasperformancedataframefilterpandas-groupby

解决方案


尝试这个:

merged = df.merge(df_ranges, on='ID')
target_df = merged[(merged.X>=merged.X_min)&(merged.X<=merged.X_max)][['ID', 'X', 'Y']]  # Here, desired filter is applied.

print(target_df)会给:

 ID    X    Y
0  0.0  2.1  3.1
1  0.0  2.2  3.5
3  0.0  2.4  2.7
7  0.1  3.2  4.3

推荐阅读