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

Series и DataFrame: создание, index, columns, shape, dtypes

Содержание курса

Атрибуты index, columns, shape и dtypes

Когда объект создан, нужно уметь быстро понять его структуру: сколько строк и столбцов, какие у них метки, какие типы данных. Для этого у Series и DataFrame есть несколько атрибутов, которые читаются без вызова — просто обращение к имени.

shape работает одинаково для обоих объектов и возвращает кортеж размерностей. У Series это (n,) — один элемент, потому что структура одномерная. У DataFrame — (n_rows, n_cols). Это прямой аналог ndarray.shape, синтаксис идентичен.

index и columns — наборы меток. У Series есть только index. У DataFrame есть оба: index для строк, columns для столбцов. Оба атрибута возвращают объект типа Index, который можно обернуть в list(), чтобы получить обычный список меток.

dtype и dtypes — типы данных. У Series — s.dtype (единственное число), потому что у неё один массив значений. У DataFrame — df.dtypes (множественное число), потому что каждый столбец может хранить свой тип. df.dtypes возвращает отдельный Series, где индекс — имена столбцов, а значения — их типы.

В примерах этого урока встречаются три типа: int64 для целых чисел, float64 для дробных, object для строк. object — это то, что pandas назначает столбцу со строковыми или смешанными значениями при стандартном создании DataFrame из Python-списков.

Вот как это выглядит на практике:

import pandas as pd

# Series из списка
s1 = pd.Series([10, 20, 30])
print(s1.shape)   # (3,)
print(s1.dtype)   # int64
print(s1.index)   # RangeIndex(start=0, stop=3, step=1)

# Series из словаря
s2 = pd.Series({'a': 1.5, 'b': 2.5, 'c': 3.5})
print(s2.shape)        # (3,)
print(s2.dtype)        # float64
print(list(s2.index))  # ['a', 'b', 'c']

# DataFrame
df = pd.DataFrame({
    'name':   ['Анна', 'Борис', 'Вера'],
    'score':  [85, 92, 78],
    'passed': [True, True, False]
})
print(df.shape)          # (3, 3)
print(list(df.columns))  # ['name', 'score', 'passed']
print(list(df.index))    # [0, 1, 2]
print(df.dtypes)
# name      object
# score      int64
# passed      bool
# dtype: object

На что смотреть в выводе df.dtypes: столбец name получил тип object, потому что содержит строки — именно так pandas представляет строковые данные при создании из обычных Python-списков. Столбец score — int64, passed — bool.

Важный нюанс для int64: если в столбец с целыми числами попадёт хотя бы одно значение None, pandas автоматически повысит тип до float64, чтобы представить отсутствующее значение через NaN. Это поведение характерно именно для стандартного int64 — NumPy-backed типа, который используется по умолчанию:

s3 = pd.Series([1, 2, None])
print(s3.dtype)   # float64
print(s3)         # 0    1.0  1    2.0  2    NaN  dtype: float64

Практика чтения этих четырёх атрибутов стандартная: после создания любой таблицы сначала смотришь на shape, чтобы понять размер, потом на dtypes, чтобы убедиться, что типы подхватились правильно. Если score вдруг оказался object — значит, где-то в данных затесалась строка.

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

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

О переписке

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

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

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