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

Сортировка

Отсортировать таблицу по столбцу и по нескольким сразу, по возрастанию и убыванию; nlargest и nsmallest — первые N; сортировка Series и сортировка по индексу.

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

Отсортированную таблицу проще читать: сразу видно самое дорогое и самое дешёвое, первое и последнее. Сортировка отвечает на вопросы со словами «самый», «топ» и «по порядку».

По одному столбцу

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 — в прежнем порядке
products.head(3)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
product_id name category price cost
0 P01 Эспрессо-смесь 1 кг Кофе 1450 870
1 P02 Колумбия 250 г Кофе 690 380
2 P03 Эфиопия 250 г Кофе 790 430
[ ]Упражнение 1Самая низкая себестоимость решено

Сохраните в by_cost таблицу products, отсортированную по возрастанию себестоимости (cost). Затем сохраните в cheapest название товара (name) из её первой строки.

by_cost = ...
cheapest = ...

По нескольким столбцам

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

[ ]По категории, внутри категории — по цене
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

Текст сортируется по алфавиту. Заглавные буквы идут раньше строчных, поэтому «Я» окажется раньше «а» — при сортировке названий с разным регистром это стоит помнить.

[ ]Упражнение 2Полки решено

Сохраните в shelves таблицу products, отсортированную так: категории — в обратном алфавитном порядке (от Я к А), а внутри категории товары — по названию от А к Я.

shelves = ...

Первые 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())

Что выведет этот код?

Теперь таблица побольше — продажи, с выручкой каждой строки:

[ ]Продажи с выручкой
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
[ ]Упражнение 3Пять самых крупных позиций решено

Сохраните в top5 пять строк с наибольшей выручкой — только столбцы date, product, quantity, revenue.

top5 = ...

Сортировка 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
[ ]Упражнение 4Города по алфавиту решено

Сохраните в city_counts число строк по каждому городу — так, чтобы города шли по алфавиту. В first_city сохраните первый город в получившемся Series.

city_counts = ...
first_city = ...

Итоги

  • sort_values("столбец") — по возрастанию; ascending=False — по убыванию; результат нужно сохранить.
  • Список столбцов — сортировка по нескольким ключам; ascending может быть списком.
  • После сортировки метки строк остаются прежними; первая строка — iloc[0].
  • nlargest(n, "столбец"), nsmallest(n, "столбец") — первые N.
  • sort_index() сортирует по меткам индекса.

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

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