Нашли ошибку?
базовыйpandas 3.0.6

Фильтрация строк

Оставить строки, подходящие под условие, — одно или несколько, со списком значений или диапазоном.

Нужно знать:Выбор столбцов

Содержание статьи

Коротко

  • Условие над столбцом даёт булеву маску: 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    отменён
query и переменная Python
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 из-за приоритета & вычисляется неправильно.

and между условиямиошибка: ValueError
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().