Series и DataFrame: создание, index, columns, shape, dtypes
Содержание курса
Вы уже выбрали столбец таблицы и получили сумму. Теперь разберём отдельно столбец и таблицу целиком.
Создание Series: из списка и из словаря
Series — это одномерный объект pandas: последовательность значений, у каждого из которых есть метка. Метки хранятся в атрибуте index, значения — в values.
Из списка. Когда передаёшь список, pandas сам генерирует целочисленный индекс начиная с 0:
import pandas as pd
s = pd.Series([10, 20, 30])
print(s)
# 0 10
# 1 20
# 2 30
# dtype: int64
print(s.index) # RangeIndex(start=0, stop=3, step=1)
print(s.values) # array([10, 20, 30])
RangeIndex — это не просто список чисел, а ленивый объект, аналогичный range. Pandas не хранит все метки явно в памяти, пока они стандартные целые числа от 0 до n.
Из словаря. Когда передаёшь словарь, ключи становятся метками index, значения — данными:
s2 = pd.Series({'x': 10, 'y': 20, 'z': 30})
print(s2)
# x 10
# y 20
# z 30
# dtype: int64
print(list(s2.index)) # ['x', 'y', 'z']
print(list(s2.values)) # [10, 20, 30]
Порядок меток соответствует порядку ключей в словаре — в Python 3.7+ словари упорядочены, поэтому результат предсказуем.
В обоих случаях структура одна и та же: массив значений плюс набор меток. Разница только в том, кто назначает метки — pandas автоматически или ты явно через ключи словаря. Именно эти метки и называются label; как они соотносятся с порядковыми номерами — разберём отдельно.
Создание DataFrame: из словаря списков и списка словарей
DataFrame — это двумерная структура: таблица со строками и столбцами. В отличие от Series, у неё есть два набора меток: index для строк и columns для столбцов.
Создать DataFrame можно двумя основными способами, и оба дают одинаковый результат при разных входных форматах.
Способ 1: словарь списков. Ключи словаря становятся именами столбцов, а каждый список — данными этого столбца:
import pandas as pd
df = pd.DataFrame({
'name': ['Анна', 'Борис', 'Вера'],
'score': [85, 92, 78],
'passed': [True, True, False]
})
print(df)
# name score passed
# 0 Анна 85 True
# 1 Борис 92 True
# 2 Вера 78 False
Здесь мышление «колонко-центричное»: ты сначала думаешь о столбцах, потом pandas собирает из них строки. Все списки обязаны быть одной длины — иначе pandas выбросит ошибку.
Способ 2: список словарей. Каждый словарь — одна строка, ключи — имена столбцов:
df2 = pd.DataFrame([
{'name': 'Анна', 'score': 85, 'passed': True},
{'name': 'Борис', 'score': 92, 'passed': True},
{'name': 'Вера', 'score': 78, 'passed': False}
])
print(df2)
# name score passed
# 0 Анна 85 True
# 1 Борис 92 True
# 2 Вера 78 False
Здесь мышление «строко-центричное»: каждая запись — один объект. Этот формат часто встречается, когда данные приходят из API или JSON-файлов — список объектов, где каждый объект описывает одну сущность.
Оба вызова дают структурно одинаковый DataFrame: те же столбцы, те же строки, тот же автоматический целочисленный index 0, 1, 2, …
Какой способ выбрать — зависит от источника данных. Если ты формируешь таблицу из готовых колонок (например, результатов вычислений), удобнее словарь списков. Если накапливаешь строки в цикле — удобнее список словарей, и в конце один вызов pd.DataFrame(rows) собирает всё вместе.
