Нашли ошибку?
Скачать чистый
урок 4 из 5≈ 20 минупражнения: 0 из 4

Удобные фильтры

Короткие записи частых условий: isin — значение из списка, between — число в диапазоне, loc[маска, столбцы] — строки и столбцы разом, query — условие обычной строкой.

Python запустится при первом выполнении

Маски и операторы &, |, ~ позволяют записать любое условие. Но некоторые условия встречаются так часто, что для них есть короткие записи.

isin: значение из списка

Нужны строки с кофе или чаем. Через | получается длинно:

[ ]Два сравнения через «или»
import pandas as pd

orders = pd.read_csv("data/shop_orders.csv")
hot = orders[(orders["category"] == "Кофе") | (orders["category"] == "Чай")]
len(hot)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
1657

А если категорий пять? Метод isin («is in» — «входит в») проверяет, входит ли значение в список:

[ ]То же самое короче
hot = orders[orders["category"].isin(["Кофе", "Чай"])]
len(hot)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
1657

isin возвращает обычную маску, поэтому её можно перевернуть оператором ~ — «всё, кроме»:

[ ]Всё, кроме кофе и чая
other = orders[~orders["category"].isin(["Кофе", "Чай"])]
other["category"].value_counts()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
category
Сладости      500
Посуда        183
Аксессуары    108
Name: count, dtype: int64
[ ]Упражнение 1Три города решено

Сохраните в east строки из Казани, Екатеринбурга и Новосибирска. В n_capitals сохраните, сколько строк приходится на все остальные города.

east = ...
n_capitals = ...

between: число в диапазоне

«Цена от 320 до 390» — это два сравнения через &. Метод between («между») записывает их одним вызовом:

[ ]Цены от 320 до 390
middle = orders[orders["price"].between(320, 390)]
print(len(middle))
print(sorted(middle["price"].unique().tolist()))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
466
[320, 350, 390]

Обе границы входят: товары ровно за 320 и ровно за 390 попали в выборку. Если границы нужно исключить, это задаёт параметр inclusive: "both" — входят обе (так по умолчанию), "neither" — ни одна, "left" или "right" — только левая или только правая.

[ ]Строго между 320 и 390
strict = orders[orders["price"].between(320, 390, inclusive="neither")]
print(sorted(strict["price"].unique().tolist()))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[350]
Вопрос

Что выведет print(pd.Series([1, 5, 10]).between(1, 5).sum())?

[ ]Упражнение 2Средний ценовой сегмент решено

Сохраните в mid_price строки с ценой от 500 до 1000 включительно, а в mid_share — долю таких строк.

mid_price = ...
mid_share = ...

loc: строки по маске и столбцы разом

loc из позапрошлого урока принимает на месте строк не только метки, но и маску. Тогда одной записью выбираются и строки, и столбцы:

[ ]Кто купил 9 штук и больше
orders.loc[orders["quantity"] >= 9, ["date", "city", "product", "quantity"]]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
date city product quantity
364 2025-02-18 Новосибирск Эфиопия 250 г 9
401 2025-02-24 Москва Зелёный чай 100 г 9
787 2025-04-21 Новосибирск Кофе без кофеина 250 г 10
1469 2025-08-17 Москва Эфиопия 250 г 9

Если на месте столбцов одно название без списка, получается Series — по нему сразу можно считать:

[ ]Средняя цена покупок в Казани
print(orders.loc[orders["city"] == "Казань", "price"].mean())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
719.0909090909091

Читается как фраза: «из orders взять строки, где город — Казань, столбец price, посчитать среднее».

[ ]Упражнение 3Дорогие покупки в Казани решено

Сохраните в luxury покупки в Казани с ценой выше 2000 — только столбцы date, product, price. В luxury_avg сохраните среднюю цену в этих строках.

luxury = ...
luxury_avg = ...

query: условие строкой

Метод query («запрос») принимает условие как текст. Внутри текста названия столбцов пишут без кавычек и без orders[...], а условия соединяют привычными and, or, not:

[ ]Условие в виде строки
orders.query("price > 3000 and city == 'Новосибирск'")
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id date customer_id city channel category product price quantity
1143 10731 2025-06-11 C011 Новосибирск маркетплейс Аксессуары Кофемолка ручная 3200 1
1378 10893 2025-07-25 C121 Новосибирск приложение Аксессуары Кофемолка ручная 3200 2

Сравните с orders[(orders["price"] > 3000) & (orders["city"] == "Новосибирск")] — результат тот же, а читать легче. Текстовые значения внутри условия берут в кавычки другого вида: снаружи двойные — внутри одинарные.

Переменные Python в условии отмечают знаком @; список проверяют словом in:

[ ]Переменные в запросе
limit = 3000
towns = ["Казань", "Новосибирск"]
len(orders.query("price > @limit and city in @towns"))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
6

Если забыть кавычки вокруг текста, query примет слово за название столбца или переменной:

[ ]Казань без кавычекошибка: UndefinedVariableError
orders.query("city == Казань")
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
UndefinedVariableError: name 'Казань' is not defined
[ ]Упражнение 4Дорого и много решено

В переменной min_price — порог цены. Сохраните в bulk строки, где цена строго больше min_price и количество не меньше 3. Используйте query.

min_price = 1000
bulk = ...

Что выбрать — маски или query? Результат одинаковый. query короче и читается легче, когда условий несколько. Маски нужны, когда условие собирается по частям, переиспользуется или по нему считают (sum, mean). В этом курсе встречаются оба способа.

Итоги

  • столбец.isin([...]) — значение входит в список; с ~ — не входит.
  • столбец.between(a, b) — от a до b, обе границы входят; inclusive= это меняет.
  • таблица.loc[маска, столбцы] — строки по условию и нужные столбцы одной записью.
  • таблица.query("условие") — условие строкой: столбцы без кавычек, and/or/not, переменные через @.

Подробнее в справочнике

Нашли ошибку?