В таблице продаж девять столбцов, а для конкретного вопроса обычно хватает двух-трёх. Лишние столбцы мешают: таблица не помещается на экран, в ней труднее найти нужное. Научимся оставлять только то, что нужно.
Несколько столбцов
Один столбец мы уже брали: orders["price"]. Чтобы взять несколько, в скобки передают список названий:
import pandas as pd
orders = pd.read_csv("data/shop_orders.csv")
orders[["product", "price"]]| product | price | |
|---|---|---|
| 0 | Кофемолка ручная | 3200 |
| 1 | Травяной сбор 50 г | 260 |
| 2 | Шоколад горький | 180 |
| 3 | Чёрный чай 100 г | 350 |
| 4 | Эфиопия 250 г | 790 |
| ... | ... | ... |
| 2443 | Эфиопия 250 г | 790 |
| 2444 | Печенье овсяное | 150 |
| 2445 | Печенье овсяное | 150 |
| 2446 | Фильтры бумажные | 240 |
| 2447 | Зефир | 210 |
2448 rows × 2 columns
Скобок получается две пары, и у них разный смысл. Внешние orders[...] — «достань из таблицы». Внутренние
["product", "price"] — обычный список Python. Результат — новая таблица (DataFrame) с теми же строками и тем же
индексом, но только с выбранными столбцами.
Если забыть внутренние скобки, pandas станет искать один столбец со странным названием — и не найдёт:
orders["product", "price"]KeyError: ('product', 'price')Сохраните в goods таблицу из трёх столбцов таблицы orders: product, price, quantity — в этом порядке.
Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
goods = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
goods = orders[["product", "price", "quantity"]]Столбцы идут в том порядке, в каком названы в списке, — так их можно переставлять. Сам список удобно сохранить в переменную:
who_where = ["city", "customer_id", "date"]
orders[who_where].head(3)| city | customer_id | date | |
|---|---|---|---|
| 0 | Москва | C095 | 2025-01-01 |
| 1 | Москва | C095 | 2025-01-01 |
| 2 | Москва | C059 | 2025-01-01 |
Один столбец: Series или таблица
Одинарные скобки возвращают Series, двойные — таблицу, даже если в списке одно название:
print(type(orders["price"]))
print(type(orders[["price"]]))<class 'pandas.Series'> <class 'pandas.DataFrame'>
orders[["price"]].head(3)| price | |
|---|---|
| 0 | 3200 |
| 1 | 260 |
| 2 | 180 |
Выглядят похоже, но это разные объекты. У Series нет названий столбцов и нет второго числа в shape; у таблицы
из одного столбца — есть. Для вычислений (sum, арифметика) почти всегда нужен Series. Таблица из одного
столбца бывает нужна, когда функция ждёт на вход именно таблицу.
Что выведет print(type(orders[["city"]]).__name__)?
orders["city"].Сохраните в price_column столбец price как Series, а в price_table — как таблицу из одного столбца.
Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
price_column = ...
price_table = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
price_column = orders["price"]
price_table = orders[["price"]]Итоги сразу по нескольким столбцам
Методы sum, mean, max, min есть и у таблицы. Они считают итог по каждому столбцу и возвращают
Series: метки — названия столбцов.
orders[["price", "quantity"]].mean()price 688.721405 quantity 2.128268 dtype: float64
mean по таблице с текстовым столбцом остановится с ошибкой, а sum склеит текст в одну длинную строку.
Поэтому сначала выбираем числовые столбцы, потом считаем.
Сохраните в maxima наибольшие значения столбцов price и quantity — одним вызовом max для таблицы
из двух столбцов. Затем достаньте из maxima наибольшее количество и сохраните в top_quantity.
orders[["price", "quantity"]].max() — Series с метками price и quantity.maxima["quantity"].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
maxima = ...
top_quantity = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
maxima = orders[["price", "quantity"]].max()
top_quantity = maxima["quantity"]Столбец через точку
Столбец можно достать и как атрибут — через точку:
orders.price.head(3)0 3200 1 260 2 180 Name: price, dtype: int64
Это то же самое, что orders["price"], и в чужом коде такая запись встречается часто. Но у неё есть ловушки:
- не работает, если в названии есть пробел или оно начинается с цифры;
- не работает, если название совпадает с методом или атрибутом таблицы;
- так нельзя создать новый столбец.
Вторая ловушка — самая коварная, потому что ошибки нет:
cups = pd.DataFrame({"name": ["S", "M", "L"], "size": [0.25, 0.35, 0.45]})
print(cups.size)
print(cups["size"].tolist())6 [0.25, 0.35, 0.45]
cups.size — не столбец, а атрибут таблицы: число всех её ячеек (3 строки × 2 столбца). Столбец достают только
скобки; метод tolist() превращает Series в обычный список Python. В этом курсе мы всегда пишем скобки — они
работают с любым названием.
Сохраните в receipt первые 10 строк таблицы orders со столбцами order_id, product, quantity, price —
в этом порядке. В n_receipt_cols сохраните число столбцов получившейся таблицы.
head(10).shape.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
receipt = ...
n_receipt_cols = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
receipt = orders[["order_id", "product", "quantity", "price"]].head(10)
n_receipt_cols = receipt.shape[1]Итоги
таблица[["a", "b"]]— таблица из выбранных столбцов, порядок — как в списке.таблица["a"]— Series,таблица[["a"]]— таблица из одного столбца.sum,mean,max,minу таблицы считают по каждому столбцу и возвращают Series.таблица.aработает не всегда; скобки — всегда.