Маски и операторы &, |, ~ позволяют записать любое условие. Но некоторые условия встречаются так часто,
что для них есть короткие записи.
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
Сохраните в east строки из Казани, Екатеринбурга и Новосибирска. В n_capitals сохраните, сколько строк
приходится на все остальные города.
orders["city"].isin([...]) — список из трёх названий.~ перед ней; число строк — len(...) или сумма маски.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
east = ...
n_capitals = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
east = orders[orders["city"].isin(["Казань", "Екатеринбург", "Новосибирск"])]
n_capitals = len(orders[~orders["city"].isin(["Казань", "Екатеринбург", "Новосибирск"])])between: число в диапазоне
«Цена от 320 до 390» — это два сравнения через &. Метод between («между») записывает их одним вызовом:
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" — только левая или только правая.
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())?
[True, True, False], её сумма — 2.Сохраните в mid_price строки с ценой от 500 до 1000 включительно, а в mid_share — долю таких строк.
orders["price"].between(500, 1000) — маска.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
mid_price = ...
mid_share = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
mid_price = orders[orders["price"].between(500, 1000)]
mid_share = orders["price"].between(500, 1000).mean()loc: строки по маске и столбцы разом
loc из позапрошлого урока принимает на месте строк не только метки, но и маску. Тогда одной записью
выбираются и строки, и столбцы:
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, посчитать среднее».
Сохраните в luxury покупки в Казани с ценой выше 2000 — только столбцы date, product, price.
В luxury_avg сохраните среднюю цену в этих строках.
orders.loc[(условие) & (условие), ["date", "product", "price"]].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
luxury = ...
luxury_avg = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
luxury = orders.loc[(orders["city"] == "Казань") & (orders["price"] > 2000), ["date", "product", "price"]]
luxury_avg = luxury["price"].mean()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 примет слово за название столбца или переменной:
orders.query("city == Казань")UndefinedVariableError: name 'Казань' is not defined
В переменной min_price — порог цены. Сохраните в bulk строки, где цена строго больше min_price и количество
не меньше 3. Используйте query.
@: price > @min_price.query соединяет слово and.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
min_price = 1000
bulk = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
min_price = 1000
bulk = orders.query("price > @min_price and quantity >= 3")Что выбрать — маски или query? Результат одинаковый. query короче и читается легче, когда условий
несколько. Маски нужны, когда условие собирается по частям, переиспользуется или по нему считают (sum,
mean). В этом курсе встречаются оба способа.
Итоги
столбец.isin([...])— значение входит в список; с~— не входит.столбец.between(a, b)— отaдоb, обе границы входят;inclusive=это меняет.таблица.loc[маска, столбцы]— строки по условию и нужные столбцы одной записью.таблица.query("условие")— условие строкой: столбцы без кавычек,and/or/not, переменные через@.