Как эффективно фильтровать Dataframe на основе столбца ID, который соответствует второму Dataframe, содержащему условия для каждого идентификатора, эффективно? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть 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)

1 Ответ

0 голосов
/ 15 октября 2019

Попробуйте:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...