По моему личному мнению, ваш нынешний подход довольно честен, насколько честен синтаксис Панд.
Одним из способов оптимизации, если вам действительно необходимо это сделать, является использование базовых массивов NumPy для генерации логических масок. Вообще говоря, у Pandas могут быть дополнительные издержки, связанные с перегрузкой операторов по сравнению с NumPy. (С компромиссом возможно большая гибкость и по сути плавная обработка данных NaN.)
price = df1.price.values
promo = df1.promo.values
# Note: this is a view to a slice of df1
results = df1.loc[
(df1.Year.values == Year) &
(df1.headline.values == text) &
(price > price1) &
(price < price2) &
(promo > promo1) &
(promo < promo2)
]
Во-вторых, убедитесь, что вы уже пользуетесь numexpr
, что разрешено делать Пандам:
>>> import pandas as pd
>>> pd.get_option('compute.use_numexpr') # use `pd.set_option()` if False
True