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

Первичный осмотр

Что делать с незнакомой таблицей в первые минуты: info и describe — типы, пропуски и сводка по числам; value_counts, nunique и unique — какие значения встречаются и как часто.

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

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

info: столбцы, типы, пропуски

[ ]Паспорт таблицы
import pandas as pd

orders = pd.read_csv("data/shop_orders.csv")
orders.info()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
<class 'pandas.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Data columns (total 9 columns):
 #   Column       Non-Null Count  Dtype
---  ------       --------------  -----
 0   order_id     2448 non-null   int64
 1   date         2448 non-null   str
 2   customer_id  2448 non-null   str
 3   city         2448 non-null   str
 4   channel      2448 non-null   str
 5   category     2448 non-null   str
 6   product      2448 non-null   str
 7   price        2448 non-null   int64
 8   quantity     2448 non-null   int64
dtypes: int64(3), str(6)
memory usage: 114.8 KB

Читаем сверху вниз: 2448 строк с индексом от 0 до 2447, 9 столбцов. Для каждого столбца — сколько в нём непустых значений (Non-Null Count) и тип (Dtype). Здесь у всех столбцов 2448 непустых значений из 2448 — пропусков нет. Если бы в столбце было меньше, значит, часть значений пропущена: с этим мы встретимся в модуле об очистке данных.

Обратите внимание на date: тип str, то есть даты прочитаны как обычный текст. Пока нам это не мешает; превращать их в настоящие даты научимся позже.

Последняя строка — сколько памяти занимает таблица. На вашем компьютере это число будет другим: оно зависит от того, как pandas хранит текст на конкретной машине.

describe: сводка по числам

[ ]Сводка по числовым столбцам
orders.describe()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id price quantity
count 2448.000000 2448.000000 2448.000000
mean 10787.296977 688.721405 2.128268
std 456.972637 537.676249 1.386154
min 10001.000000 150.000000 1.000000
25% 10390.000000 320.000000 1.000000
50% 10789.000000 540.000000 2.000000
75% 11182.000000 790.000000 3.000000
max 11576.000000 3200.000000 10.000000

describe берёт только числовые столбцы и считает по каждому восемь показателей:

  • count — сколько значений;
  • mean — среднее;
  • std — стандартное отклонение: насколько значения в среднем далеки от среднего (подробно — в модуле о статистике);
  • min и max — наименьшее и наибольшее;
  • 25%, 50%, 75% — значения, ниже которых лежит четверть, половина и три четверти данных. 50% называют медианой: половина значений меньше неё, половина — больше.

Сводка по order_id бессмысленна: номер заказа — это число, но не величина, среднее у него считать незачем. pandas этого знать не может — решать, что имеет смысл, приходится нам.

У столбца price среднее 689, а медиана 540: половина строк дешевле 540 ₽, но несколько дорогих товаров тянут среднее вверх.

describe есть и у отдельного столбца — тогда результат не таблица, а Series с метками count, mean…:

[ ]Сводка по одному столбцу
orders["price"].describe()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
count    2448.000000
mean      688.721405
std       537.676249
min       150.000000
25%       320.000000
50%       540.000000
75%       790.000000
max      3200.000000
Name: price, dtype: float64
[ ]Упражнение 1Сколько штук берут обычно решено

Сохраните в quantity_stats сводку describe по столбцу quantity, а в typical — медиану количества, достав её из сводки по метке.

quantity_stats = ...
typical = ...

value_counts: как часто встречается каждое значение

У текстовых столбцов средних нет. Главный вопрос к ним — какие значения есть и сколько раз каждое встречается. На него отвечает value_counts:

[ ]Сколько строк у каждого города
orders["city"].value_counts()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
city
Москва             948
Санкт-Петербург    589
Казань             341
Екатеринбург       312
Новосибирск        258
Name: count, dtype: int64

Результат — Series, в котором метки индекса — сами значения столбца, а значения — сколько раз они встретились. Строки отсортированы от самого частого к самому редкому. Раз это Series с метками, число можно достать по метке:

[ ]Число по метке и сам индекс
city_counts = orders["city"].value_counts()
print(city_counts["Казань"])
print(city_counts.index)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
341
Index(['Москва', 'Санкт-Петербург', 'Казань', 'Екатеринбург', 'Новосибирск'], dtype='str', name='city')

Индекс можно читать как список: city_counts.index[0] — первая метка, то есть самый частый город.

Не забывайте, что считаются строки, то есть позиции заказов: 948 — это не число заказов из Москвы, а число купленных там позиций.

[ ]Упражнение 2Каналы продаж решено

Сохраните в channel_counts, сколько строк приходится на каждый канал продаж (столбец channel), а в app_rows — число строк, купленных через приложение: достаньте его из channel_counts по метке "приложение".

channel_counts = ...
app_rows = ...

nunique и unique: сколько разных значений и какие

nunique (number of unique) считает, сколько в столбце разных значений:

[ ]Сколько городов и товаров
print(orders["city"].nunique())
print(orders["product"].nunique())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
5
20

У таблицы nunique возвращает это число для каждого столбца сразу:

[ ]Разных значений в каждом столбце
orders.nunique()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id       1576
date            358
customer_id     213
city              5
channel           3
category          5
product          20
price            20
quantity         10
dtype: int64

Так и находится ответ на вопрос из первого урока: строк 2448, а разных order_id — 1576. Заказов 1576.

Сами разные значения возвращает unique — в том порядке, в каком они впервые встретились в столбце:

[ ]Какие бывают каналы
orders["channel"].unique()
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
<StringArray>
['маркетплейс', 'приложение', 'сайт']
Length: 3, dtype: str

unique возвращает не список, а массив — так pandas хранит значения столбца. Слово перед списком значений (StringArray или ArrowStringArray) зависит от компьютера и на результат не влияет. Когда нужен обычный список Python, массив передают в list(...); отсортированный список вернёт sorted(...):

[ ]Обычный список
list(orders["channel"].unique())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
['маркетплейс', 'приложение', 'сайт']
Вопрос

Что выведет print(orders["order_id"].nunique() == len(orders))?

[ ]Упражнение 3Дни и категории решено

Сохраните в n_days, в скольких разных днях года были продажи (столбец date), а в categories — список категорий товаров (столбец category), отсортированный по алфавиту.

n_days = ...
categories = ...

[ ]Упражнение 4Самый частый товар решено

Сохраните в product_counts, сколько строк приходится на каждый товар (столбец product). Затем в best_seller — название товара, который встречается чаще всех, а в best_rows — в скольких строках он встречается.

product_counts = ...
best_seller = ...
best_rows = ...

Итоги

  • info() — столбцы, типы и число непустых значений; describe() — сводка по числовым столбцам.
  • value_counts() — сколько раз встречается каждое значение: Series, где метки — значения столбца.
  • nunique() — сколько разных значений; unique() — какие именно.
  • Прежде чем считать, спросите себя, что значит одна строка таблицы: здесь это позиция заказа, а не заказ.

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

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