Короткий ответ
Каждое условие нужно заключать в отдельные скобки перед объединением через & (и) или | (или), иначе Python попытается применить побитовый оператор раньше сравнения и выбросит ошибку или даст неверный результат.
Как это работает подробнее
операторы & и | в Python имеют более высокий приоритет, чем операторы сравнения (>, ==, < и так далее), поэтому без скобок выражение df['a'] > 1 & df['b'] < 2 интерпретируется не так, как ожидает пользователь, и обычно вызывает ошибку.
Пример кода
Пример Python
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': [5, 1, 4]})
filtered = df[(df['a'] > 1) & (df['b'] < 5)]
print(filtered)Что использовать на практике
- На практике: правильная запись выглядит как df[(df['a'] > 1) & (df['b'] < 2)]; для булевых условий в pandas нельзя использовать обычные and/or, потому что они ожидают единственное булево значение, а не поэлементный Series.
- Проверка: результат должен содержать только строки, где одновременно a>1 и b<5, то есть строки с a=2,b=1 и a=3,b=4; строку a=1 исключает первое условие.
Подводные камни
- Частые ошибки: пишут df[df['a'] > 1 and df['b'] < 2] и получают ValueError о неоднозначности истинности Series; забывают скобки вокруг отдельных условий при использовании & и |, получая TypeError или тихо неверный результат из-за иного порядка операций.