Коротко
- Условие над столбцом даёт булеву маску:
df["amount"] > 1000.df[маска]оставляет строки, гдеTrue. - Условия объединяют через
&(и),|(или),~(не), каждое — в скобках.and/orне работают. isin([...])— значение из списка,between(a, b)— в диапазоне (границы включены).query("amount > 1000 and city == 'Омск'")— то же строкой; переменные Python — через@.- Фильтр плюс выбор столбцов —
df.loc[маска, ["a", "b"]].
Синтаксис
df[df["col"] > 0]
df[(df["a"] > 0) & (df["b"] == "x")]
df[df["col"].isin(["x", "y"])]
df[df["col"].between(1, 10, inclusive="both")]
df.query("a > @limit and b == 'x'")
df.loc[mask, ["a", "b"]]Параметры
ПараметрЧто делаетПо умолчанию
inclusiveв between: "both", "neither", "left", "right" — какие границы включать"both"exprв query: условие строкой; имена столбцов как переменные, @имя — переменная PythonобязательныйПримеры
orders = pd.DataFrame({
"city": ["Омск", "Тула", "Сочи", "Омск", "Тула", "Пермь"],
"amount": [1200, 450, 3100, 800, 2500, 950],
"status": ["доставлен", "отменён", "доставлен", "в пути", "доставлен", "отменён"],
})orders[orders["amount"] > 1000]Вывод
city amount status 0 Омск 1200 доставлен 2 Сочи 3100 доставлен 4 Тула 2500 доставлен
print(orders[(orders["city"] == "Омск") & (orders["amount"] > 1000)])
orders[(orders["city"] == "Сочи") | (orders["status"] == "отменён")]Вывод
city amount status
0 Омск 1200 доставлен
city amount status
1 Тула 450 отменён
2 Сочи 3100 доставлен
5 Пермь 950 отменёнorders[~(orders["status"] == "отменён")]Вывод
city amount status 0 Омск 1200 доставлен 2 Сочи 3100 доставлен 3 Омск 800 в пути 4 Тула 2500 доставлен
orders[orders["city"].isin(["Омск", "Тула"])]Вывод
city amount status 0 Омск 1200 доставлен 1 Тула 450 отменён 3 Омск 800 в пути 4 Тула 2500 доставлен
orders[orders["amount"].between(800, 1200)] # границы включеныВывод
city amount status 0 Омск 1200 доставлен 3 Омск 800 в пути 5 Пермь 950 отменён
limit = 1000
orders.query("amount > @limit and status == 'доставлен'")Вывод
city amount status 0 Омск 1200 доставлен 2 Сочи 3100 доставлен 4 Тула 2500 доставлен
orders.loc[orders["amount"] > 2000, ["city", "amount"]]Вывод
city amount 2 Сочи 3100 4 Тула 2500
Фильтр по тексту (содержит, начинается с) — в статье строки.
Подводные камни
and / or и условия без скобок
Как и в NumPy, and пытается превратить Series в одно значение. А без скобок df["a"] > 0 & df["b"] < 5 из-за приоритета & вычисляется неправильно.
orders[(orders["amount"] > 500) and (orders["city"] == "Омск")]Ошибка
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().