Самый быстрый способ многократной фильтрации фрейма данных на основе условий

#python #pandas #dataframe #indexing

#python #pandas #фрейм данных #индексирование

Вопрос:

У меня есть фрейм данных, где мне нужно фильтровать по условиям несколько раз (более 200 тысяч раз), чтобы учесть уникальные результаты, которые могут получиться. Мне любопытно, есть ли более быстрый способ поиска и фильтрации по конкретным условиям.

Моя текущая реализация приведена ниже

    Description Ticker     Start   Stop
0  A          B          220     100
1  Ab         TEST       180     103
2  Bac        RANDOM     205     32
3  Ba         BLAH       100     2
4  Ca         BLAH       92      40
5  Cd         B          85      25
6  A          B          221      71
7  A          B          400      171

def filter_df(object):
    stock_source = 'A'
    ticker = 'B'
    target = 120

    my_df = object.maindf[(object.maindf['Description'].values == stock_source) amp; (object.maindf['Ticker'].values == ticker]
    condition = (my_df['Start'].values <= target) amp; (my_df['Stop'].values >= target)

    my_df = my_df[condition]
    return my_df
  

Для приведенного выше примера я должен получить только строки с индексами 0 и 6, над которыми я выполняю некоторые другие действия

  ncalls  tottime  percall  cumtime  percall filename:lineno(function)
31192    1.950    0.000   37.554    0.001 test.py:95(filter_df)
  

Спасибо за помощь

Ответ №1:

Вы можете использовать что-то вроде:

 stock_source = 'A'
ticker = 'B'
target = 120
m=df.Description.eq(stock_source) amp; df.Ticker.eq(ticker) 
            amp; ((df.Start.ge(target))amp;(df.Stop.le(target)))
df[m]

  Description Ticker  Start  Stop
0           A      B    220   100
6           A      B    221    71
  

P.S: Вы можете создавать отдельные логические маски для каждого условия. 🙂

Комментарии:

1. Я пробовал это, кажется, это замедлило работу. 31192 0.973 0.000 91.404 0.003 test.py: 95(filter_df). Одно замечание, мне нужно сначала запустить первый набор условий и фильтра, а затем запустить второй набор. Это связано с некоторыми другими записями в фрейме данных