Отсортированную таблицу проще читать: сразу видно самое дорогое и самое дешёвое, первое и последнее. Сортировка отвечает на вопросы со словами «самый», «топ» и «по порядку».
По одному столбцу
sort_values сортирует строки по значениям столбца — по возрастанию:
import pandas as pd
products = pd.read_csv("data/products.csv")
products.sort_values("price").head()| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 10 | P11 | Печенье овсяное | Сладости | 150 | 70 |
| 9 | P10 | Шоколад горький | Сладости | 180 | 90 |
| 12 | P13 | Зефир | Сладости | 210 | 100 |
| 18 | P19 | Фильтры бумажные | Аксессуары | 240 | 90 |
| 8 | P09 | Травяной сбор 50 г | Чай | 260 | 100 |
По убыванию — параметр ascending=False («ascending» — «возрастающий»):
products.sort_values("price", ascending=False).head(4)| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 17 | P18 | Кофемолка ручная | Аксессуары | 3200 | 1900 |
| 15 | P16 | Турка медная | Посуда | 2400 | 1300 |
| 14 | P15 | Френч-пресс | Посуда | 1890 | 950 |
| 0 | P01 | Эспрессо-смесь 1 кг | Кофе | 1450 | 870 |
Посмотрите на индекс слева: 17, 15, 14… Строки переехали вместе со своими метками. Метка по-прежнему называет ту же строку, а вот позиция у строки теперь другая.
Как и другие методы, sort_values возвращает новую таблицу. Исходная осталась как была:
products.head(3)| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 0 | P01 | Эспрессо-смесь 1 кг | Кофе | 1450 | 870 |
| 1 | P02 | Колумбия 250 г | Кофе | 690 | 380 |
| 2 | P03 | Эфиопия 250 г | Кофе | 790 | 430 |
Сохраните в by_cost таблицу products, отсортированную по возрастанию себестоимости (cost). Затем
сохраните в cheapest название товара (name) из её первой строки.
products.sort_values("cost").by_cost.iloc[0]. Из строки значение достаёт название столбца: by_cost.iloc[0]["name"].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
by_cost = ...
cheapest = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
by_cost = products.sort_values("cost")
cheapest = by_cost.iloc[0]["name"]По нескольким столбцам
Если передать список столбцов, строки сортируются по первому, а при равных значениях первого — по второму:
products.sort_values(["category", "price"]).head(7)| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 18 | P19 | Фильтры бумажные | Аксессуары | 240 | 90 |
| 19 | P20 | Термокружка | Аксессуары | 1150 | 560 |
| 17 | P18 | Кофемолка ручная | Аксессуары | 3200 | 1900 |
| 1 | P02 | Колумбия 250 г | Кофе | 690 | 380 |
| 4 | P05 | Кофе без кофеина 250 г | Кофе | 720 | 410 |
| 2 | P03 | Эфиопия 250 г | Кофе | 790 | 430 |
| 3 | P04 | Бразилия 1 кг | Кофе | 1290 | 780 |
Направление можно задать для каждого столбца отдельно — списком той же длины:
products.sort_values(["category", "price"], ascending=[True, False]).head(7)| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 17 | P18 | Кофемолка ручная | Аксессуары | 3200 | 1900 |
| 19 | P20 | Термокружка | Аксессуары | 1150 | 560 |
| 18 | P19 | Фильтры бумажные | Аксессуары | 240 | 90 |
| 0 | P01 | Эспрессо-смесь 1 кг | Кофе | 1450 | 870 |
| 3 | P04 | Бразилия 1 кг | Кофе | 1290 | 780 |
| 2 | P03 | Эфиопия 250 г | Кофе | 790 | 430 |
| 4 | P05 | Кофе без кофеина 250 г | Кофе | 720 | 410 |
Текст сортируется по алфавиту. Заглавные буквы идут раньше строчных, поэтому «Я» окажется раньше «а» — при сортировке названий с разным регистром это стоит помнить.
Сохраните в shelves таблицу products, отсортированную так: категории — в обратном алфавитном порядке
(от Я к А), а внутри категории товары — по названию от А к Я.
["category", "name"].ascending=[False, True].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
shelves = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
shelves = products.sort_values(["category", "name"], ascending=[False, True])Первые N
«Три самых дорогих товара» — это сортировка по убыванию и head(3). Для такого частого случая есть
короткая запись — nlargest («n наибольших»):
products.nlargest(3, "price")| product_id | name | category | price | cost | |
|---|---|---|---|---|---|
| 17 | P18 | Кофемолка ручная | Аксессуары | 3200 | 1900 |
| 15 | P16 | Турка медная | Посуда | 2400 | 1300 |
| 14 | P15 | Френч-пресс | Посуда | 1890 | 950 |
И парный метод nsmallest:
products.nsmallest(3, "price")[["name", "price"]]| name | price | |
|---|---|---|
| 10 | Печенье овсяное | 150 |
| 9 | Шоколад горький | 180 |
| 12 | Зефир | 210 |
t = pd.DataFrame({"x": [3, 1, 2]})
t.sort_values("x")
print(t["x"].tolist())Что выведет этот код?
sort_values вернул отсортированную таблицу, но её не сохранили. В t порядок прежний.Теперь таблица побольше — продажи, с выручкой каждой строки:
orders = pd.read_csv("data/shop_orders.csv")
orders["revenue"] = orders["price"] * orders["quantity"]
orders[["product", "quantity", "revenue"]].head(3)| product | quantity | revenue | |
|---|---|---|---|
| 0 | Кофемолка ручная | 2 | 6400 |
| 1 | Травяной сбор 50 г | 1 | 260 |
| 2 | Шоколад горький | 1 | 180 |
Сохраните в top5 пять строк с наибольшей выручкой — только
столбцы date, product, quantity, revenue.
orders.nlargest(5, "revenue") — и список нужных столбцов в скобках после.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
top5 = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
top5 = orders.nlargest(5, "revenue")[["date", "product", "quantity", "revenue"]]Сортировка Series
У Series тоже есть sort_values — название столбца ему не нужно. А ещё Series и таблицы можно сортировать
по индексу — методом sort_index. Это полезно после value_counts, который ставит вперёд самое частое:
counts = orders["price"].value_counts()
counts.head(4)price 690 218 720 213 790 210 260 176 Name: count, dtype: int64
counts.sort_index().head(4)price 150 138 180 120 210 124 240 50 Name: count, dtype: int64
Теперь читается как шкала цен: товар за 150 ₽ встречается в 138 строках, за 180 ₽ — в 120 и так далее.
orders["city"].value_counts().sort_values().head(3)city Новосибирск 258 Екатеринбург 312 Казань 341 Name: count, dtype: int64
Сохраните в city_counts число строк по каждому городу — так, чтобы города шли по алфавиту. В first_city
сохраните первый город в получившемся Series.
orders["city"].value_counts().sort_index() — метки-города отсортируются по алфавиту.city_counts.index[0].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
city_counts = ...
first_city = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
city_counts = orders["city"].value_counts().sort_index()
first_city = city_counts.index[0]Итоги
sort_values("столбец")— по возрастанию;ascending=False— по убыванию; результат нужно сохранить.- Список столбцов — сортировка по нескольким ключам;
ascendingможет быть списком. - После сортировки метки строк остаются прежними; первая строка —
iloc[0]. nlargest(n, "столбец"),nsmallest(n, "столбец")— первые N.sort_index()сортирует по меткам индекса.