Pandas DataFrame оптимизированный запрос - PullRequest
0 голосов
/ 06 июня 2018

У меня довольно большой фрейм данных с числом записей более 100 000.Мне нужно многократно выполнять поиск диапазона по числовому полю этого кадра данных.Я могу выполнить этот поиск, используя loc или запрос, но это занимает много времени.Я думаю, причина в том, что сейчас это поиск грубой силы.есть ли способ сгенерировать индекс для этого числового поля, чтобы я мог лучше оптимизировать поиск в этом диапазоне.

образец кадра данных -

field1   field2   field3
red        car     1000000000
green      truck   2000000000
yellow     bus     3000000000
white      bike    4000000000
black      cycle   5000000000

поиск -

dataframe.query(field3 > 1000000000 & field3 < 5000000000)

Я использую этот запрос в цикле for, который выполняется около 6000 раз.Мой общий код занимает около 25 минут.От 150 мс, вызов этой части 6000 раз будет 900 секунд, то есть 15 минут.Если я смогу каким-то образом создать индекс для этого поля, то я думаю, что время запроса будет резко сокращено.

1 Ответ

0 голосов
/ 06 июня 2018

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