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

Таблица своими руками

Собрать DataFrame из словаря списков или списка словарей, посмотреть типы столбцов, задать свои подписи строк и создать отдельный Series.

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

Таблицы не всегда приходят из файлов. Небольшую таблицу — справочник, результаты расчёта, пример для проверки идеи — проще собрать прямо в коде. Заодно станет понятнее, как DataFrame устроен внутри.

Из словаря списков

Самый частый способ: словарь, где ключ — название столбца, а значение — список значений этого столбца.

[ ]Меню кофейни
import pandas as pd

menu = pd.DataFrame({
    "drink": ["эспрессо", "капучино", "латте", "какао"],
    "price": [150, 240, 260, 220],
    "volume": [0.06, 0.25, 0.35, 0.3],
})
menu
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
drink price volume
0 эспрессо 150 0.06
1 капучино 240 0.25
2 латте 260 0.35
3 какао 220 0.30

Получилась обычная таблица: у неё есть shape, столбцы достаются скобками и умеют всё то же, что столбцы таблицы из файла.

[ ]Размер и средняя цена
print(menu.shape)
print(menu["price"].mean())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(4, 3)
217.5

Списки должны быть одной длины — в таблице не бывает столбцов разной высоты:

[ ]Три напитка, две ценыошибка: ValueError
pd.DataFrame({
    "drink": ["эспрессо", "капучино", "латте"],
    "price": [150, 240],
})
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
ValueError: All arrays must be of the same length
[ ]Упражнение 1Сотрудники решено

Создайте таблицу staff с тремя столбцами: name — Анна, Олег, Мария; role — бариста, бариста, управляющий; salary — 62000, 58000, 95000.

staff = ...

Типы столбцов

В одном столбце лежат значения одного типа. Типы всех столбцов показывает атрибут dtypes:

[ ]Типы столбцов меню
menu.dtypes
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
drink         str
price       int64
volume    float64
dtype: object

pandas определил типы сам по значениям: текст — str, целые числа — int64, дробные — float64. Число 64 — сколько бит памяти занимает одно значение; помнить его не нужно. Слово object в последней строке относится к самому списку типов, а не к таблице.

Тип важен: с числовым столбцом можно считать, с текстовым — нет. Если числа попали в таблицу как текст (в кавычках), sum склеит их как строки, а mean упадёт с ошибкой. Как чинить такие столбцы, разберём в модуле об очистке данных.

Вопрос

В списке [1, 2.5, 3] есть и целые, и дробное число. Какой тип получит столбец x в pd.DataFrame({"x": [1, 2.5, 3]})?

Из списка словарей

Второй способ — список, в котором каждый словарь описывает одну строку. Так часто выглядят данные, пришедшие из интернета или собранные в цикле:

[ ]Строка за строкой
visits = pd.DataFrame([
    {"day": "пн", "guests": 84, "rain": False},
    {"day": "вт", "guests": 91, "rain": True},
    {"day": "ср", "guests": 77, "rain": True},
])
visits
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
day guests rain
0 пн 84 False
1 вт 91 True
2 ср 77 True

Названия столбцов pandas взял из ключей. Появился ещё один тип: bool — логические значения True и False.

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

Создайте таблицу stock из списка словарей — три строки со столбцами item и liters: молоко — 12.5, сливки — 3.0, сироп — 1.5. Затем сохраните в total_liters, сколько всего литров на складе.

stock = ...
total_liters = ...

Свои подписи строк

До сих пор индекс был номерами 0, 1, 2… Параметр index= задаёт свои подписи строк — метки (labels):

[ ]Размеры стаканов
sizes = pd.DataFrame(
    {"volume": [0.25, 0.35, 0.45], "extra": [0, 30, 60]},
    index=["S", "M", "L"],
)
sizes
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
volume extra
S 0.25 0
M 0.35 30
L 0.45 60

Индекс не входит в число столбцов: у sizes два столбца, а S, M, L — подписи строк. Сам индекс хранится в атрибуте index:

[ ]Индекс с метками и индекс из номеров
print(sizes.index)
print(menu.index)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Index(['S', 'M', 'L'], dtype='str')
RangeIndex(start=0, stop=4, step=1)

Series без таблицы

Один столбец тоже можно создать отдельно — pd.Series из списка. Параметр index= задаёт метки, name= — название:

[ ]Чаевые по дням
tips = pd.Series([120, 80, 200, 150], index=["пн", "вт", "ср", "чт"], name="tips")
tips
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
пн    120
вт     80
ср    200
чт    150
Name: tips, dtype: int64

По метке значение достают квадратными скобками — как из словаря:

[ ]Значение по метке и сумма
print(tips["ср"])
print(tips.sum())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
200
550

Series — это пары «метка → значение» с общим типом и названием. А DataFrame — несколько Series с общим индексом, поставленные рядом: каждый столбец — Series. Поэтому menu["price"] возвращает именно Series.

[ ]Упражнение 3Гости за неделю решено

Создайте Series guests с названием guests: значения 84, 91, 77, 102, 130, метки — пн, вт, ср, чт, пт. Сохраните в friday число гостей в пятницу, достав его из guests по метке.

guests = ...
friday = ...

Итоги

  • pd.DataFrame({"столбец": [значения], ...}) — таблица из словаря списков; списки одной длины.
  • pd.DataFrame([{...}, {...}]) — таблица из списка словарей: словарь — строка.
  • dtypes — типы столбцов: int64, float64, str, bool.
  • index= задаёт метки строк; pd.Series(значения, index=..., name=...) — отдельный столбец.
  • DataFrame — это несколько Series с общим индексом.

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

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