DataFrame.query() в pandas — фильтрация строк выражением-строкой

query() отбирает строки DataFrame по условию, записанному обычной строкой: df.query('amount > 1000'). Читается ближе к SQL-WHERE, чем цепочка булевых масок, и не плодит промежуточных df[...]. Внутри выражения имя колонки — это переменная; чтобы сослаться на внешнюю переменную Python, ставь перед ней @. Колонки с пробелами или спецсимволами оборачивай в обратные кавычки.

Синтаксис

df.query(expr, *, inplace=False, engine=None)

Примеры использования

Пример 1: Простое условие AND

df.query('amount > 1000 and channel == "ads"')

Результат:

   order_id  user_id channel  amount        date
2      1003      501     ads    1500  2026-01-03
5      1006      777     ads    2100  2026-01-06

Пример 2: Ссылка на список через @

vip = [501, 777]
df.query('user_id in @vip')

Результат:

   order_id  user_id channel  amount        date
0      1001      501   email     450  2026-01-01
2      1003      501     ads    1500  2026-01-03
5      1006      777     ads    2100  2026-01-06

Пример 3: Колонка с пробелом в имени

df.query('`gross amount` >= 1000')

Результат:

   order_id  gross amount
2      1003          1500
5      1006          2100
Порешать Python-задачи в тренажёре →

Типичная ошибка

Строковые сравнения чувствительны к регистру, а движок numexpr не поддерживает часть Python-функций — сложные выражения приходится гнать через engine='python'. NaN не проходит ни одно сравнение, поэтому строки с пропусками молча отсеиваются. Имена колонок, совпадающие с ключевыми словами Python (class, in), требуют обратных кавычек.

Где спрашивают на собеседовании

Спрашивают в паре с булевой индексацией df[df['x']>0]: интервьюер проверяет, понимаешь ли ты, что query() — синтаксический сахар и что для внешних переменных нужен @. Хорошо идёт вместе с .eval() и цепочками .pipe().

FAQ: частые вопросы про query

Чем query() отличается от булевой маски df[df['amount']>1000]?

Результат тот же, но query() принимает условие строкой и читается компактнее, особенно при нескольких условиях. Маска не требует numexpr и быстрее на маленьких данных. На больших числовых DataFrame query() может выигрывать за счёт движка numexpr.

Как в query() использовать список из Python-переменной?

Поставь @ перед именем: df.query('user_id in @vip'). Без @ pandas будет искать колонку с именем vip и упадёт с UndefinedVariableError. Через @ можно подставлять списки, числа, строки и другие объекты.

Можно ли менять DataFrame через query() на месте?

Да, через inplace=True, но это не рекомендуется — pandas постепенно отказывается от inplace, и код на цепочках надёжнее. Обычно просто присваивают результат: df = df.query(...).

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →