Выражение df[mask] или df.loc[mask] оставляет строки, где mask True; маски комбинируют & | ~ с скобками (не and/or).
Разбор
query("x > 0 and y == 'a'") — читаемее для простых условий.
isin, between, строковые .str.contains.
- После фильтра сделайте
copy(), если дальше пишете в df.
- Пустой результат — валидный кейс, проверяйте
empty.
Пример
out = df.loc[(df["amount"] > 0) & (df["status"].isin(["ok", "paid"]))]
Итог
Фильтрация = булева маска по колонкам; скобки обязательны для &/|.