Таблицы не всегда приходят из файлов. Небольшую таблицу — справочник, результаты расчёта, пример для проверки идеи — проще собрать прямо в коде. Заодно станет понятнее, как 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
Списки должны быть одной длины — в таблице не бывает столбцов разной высоты:
pd.DataFrame({
"drink": ["эспрессо", "капучино", "латте"],
"price": [150, 240],
})ValueError: All arrays must be of the same length
Создайте таблицу staff с тремя столбцами: name — Анна, Олег, Мария; role — бариста, бариста, управляющий;
salary — 62000, 58000, 95000.
pd.DataFrame({"name": [...], "role": [...], "salary": [...]}) — три ключа, три списка по три значения.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
staff = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
staff = pd.DataFrame({
"name": ["Анна", "Олег", "Мария"],
"role": ["бариста", "бариста", "управляющий"],
"salary": [62000, 58000, 95000],
})Типы столбцов
В одном столбце лежат значения одного типа. Типы всех столбцов показывает атрибут dtypes:
menu.dtypesdrink 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]})?
float64.Из списка словарей
Второй способ — список, в котором каждый словарь описывает одну строку. Так часто выглядят данные, пришедшие из интернета или собранные в цикле:
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.
Создайте таблицу stock из списка словарей — три строки со столбцами item и liters: молоко — 12.5,
сливки — 3.0, сироп — 1.5. Затем сохраните в total_liters, сколько всего литров на складе.
pd.DataFrame([{"item": "молоко", "liters": 12.5}, {...}, {...}]).stock["liters"].sum().Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
stock = ...
total_liters = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
stock = pd.DataFrame([
{"item": "молоко", "liters": 12.5},
{"item": "сливки", "liters": 3.0},
{"item": "сироп", "liters": 1.5},
])
total_liters = stock["liters"].sum()Свои подписи строк
До сих пор индекс был номерами 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.
Создайте Series guests с названием guests: значения 84, 91, 77, 102, 130, метки — пн, вт, ср, чт, пт.
Сохраните в friday число гостей в пятницу, достав его из guests по метке.
pd.Series([...], index=[...], name="guests").guests["пт"].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
guests = ...
friday = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
guests = pd.Series([84, 91, 77, 102, 130], index=["пн", "вт", "ср", "чт", "пт"], name="guests")
friday = guests["пт"]Итоги
pd.DataFrame({"столбец": [значения], ...})— таблица из словаря списков; списки одной длины.pd.DataFrame([{...}, {...}])— таблица из списка словарей: словарь — строка.dtypes— типы столбцов:int64,float64,str,bool.index=задаёт метки строк;pd.Series(значения, index=..., name=...)— отдельный столбец.- DataFrame — это несколько Series с общим индексом.