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

Выбор столбцов

Несколько столбцов — список названий в двойных скобках; чем таблица из одного столбца отличается от Series; итоги сразу по нескольким столбцам; запись через точку и её ловушки.

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

В таблице продаж девять столбцов, а для конкретного вопроса обычно хватает двух-трёх. Лишние столбцы мешают: таблица не помещается на экран, в ней труднее найти нужное. Научимся оставлять только то, что нужно.

Несколько столбцов

Один столбец мы уже брали: 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 станет искать один столбец со странным названием — и не найдёт:

[ ]Забыли скобки спискаошибка: KeyError
orders["product", "price"]
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
KeyError: ('product', 'price')
[ ]Упражнение 1Что и сколько купили решено

Сохраните в goods таблицу из трёх столбцов таблицы orders: product, price, quantity — в этом порядке.

goods = ...

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

[ ]Свой порядок столбцов
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__)?

[ ]Упражнение 2Одни скобки или двое решено

Сохраните в price_column столбец price как Series, а в price_table — как таблицу из одного столбца.

price_column = ...
price_table = ...

Итоги сразу по нескольким столбцам

Методы sum, mean, max, min есть и у таблицы. Они считают итог по каждому столбцу и возвращают Series: метки — названия столбцов.

[ ]Средние цена и количество
orders[["price", "quantity"]].mean()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
price       688.721405
quantity      2.128268
dtype: float64

mean по таблице с текстовым столбцом остановится с ошибкой, а sum склеит текст в одну длинную строку. Поэтому сначала выбираем числовые столбцы, потом считаем.

[ ]Упражнение 3Два максимума решено

Сохраните в maxima наибольшие значения столбцов price и quantity — одним вызовом max для таблицы из двух столбцов. Затем достаньте из maxima наибольшее количество и сохраните в top_quantity.

maxima = ...
top_quantity = ...

Столбец через точку

Столбец можно достать и как атрибут — через точку:

[ ]orders.price
orders.price.head(3)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
0    3200
1     260
2     180
Name: price, dtype: int64

Это то же самое, что orders["price"], и в чужом коде такая запись встречается часто. Но у неё есть ловушки:

  • не работает, если в названии есть пробел или оно начинается с цифры;
  • не работает, если название совпадает с методом или атрибутом таблицы;
  • так нельзя создать новый столбец.

Вторая ловушка — самая коварная, потому что ошибки нет:

[ ]Столбец size и атрибут size
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. В этом курсе мы всегда пишем скобки — они работают с любым названием.

[ ]Упражнение 4Чек решено

Сохраните в receipt первые 10 строк таблицы orders со столбцами order_id, product, quantity, price — в этом порядке. В n_receipt_cols сохраните число столбцов получившейся таблицы.

receipt = ...
n_receipt_cols = ...

Итоги

  • таблица[["a", "b"]] — таблица из выбранных столбцов, порядок — как в списке.
  • таблица["a"] — Series, таблица[["a"]] — таблица из одного столбца.
  • sum, mean, max, min у таблицы считают по каждому столбцу и возвращают Series.
  • таблица.a работает не всегда; скобки — всегда.

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

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