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 — значит, где-то в данных затесалась строка.
