Один из подходов состоит в том, чтобы отсортировать числовой столбец, а затем использовать searchsorted + iloc.Например,
df.iloc[df.field3.searchsorted(min_v, 'left'):df.field3.searchsorted(max_v, 'right')]
Похоже, что это примерно в 8 раз быстрее, чем df.query
на моей машине с записями 100 тыс.
Если вы знаете набор своих запросовзаранее вы можете сделать лучше.Например, скажем, у вас есть массивы mins
и maxs
с len(mins) == len(maxs) == 6000
.Вы можете предварительно вычислить
min_ix = df.field3.searchsorted(mins, 'left')
max_ix = df.field3.searchsorted(maxs, 'right')
И перебрать фильтрованные кадры с помощью
for i, j in zip(min_ix, max_ix):
print(df.iloc[i:j])