У меня есть Dataframe с одним столбцом идентификаторов и двумя столбцами данных X, Y, содержащими числовые значения. Для каждого идентификатора есть несколько строк данных.
У меня есть второй Dataframe с тем же столбцом идентификатора и двумя числовыми столбцами, задающими нижний и верхний пределы значений X для каждого идентификатора.
Я хочу использовать второй Dataframe, чтобы отфильтровать первый Dataframe, чтобы иметь только строки, которые имеют значения X в пределах диапазона X_min-X_max определенного идентификатора. filtering groupby (ID) - элементы первого DF, но это медленно для большого количества идентификаторов. Есть ли эффективный способ решить эту проблему?
Пример кода с данными в 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)