pandas: устройство, выборка и изменение таблиц

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) собирает всё вместе.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.