Типы данных в Pandas — как проверить и изменить
Зачем разбираться в типах данных
Типы данных (dtypes) определяют, что pandas может делать со столбцом: считать среднее, сортировать по дате, фильтровать по строке. Если тип неправильный — операции либо упадут с ошибкой, либо дадут неожиданный результат. Классический пример: столбец с числами загрузился как object, и вместо суммы вы получаете склейку строк.
На собеседованиях аналитиков вопросы про типы данных встречаются регулярно — обычно в связке с загрузкой данных через read_csv и обработкой пропусков.
Как проверить типы: dtypes и info
import pandas as pd
df = pd.read_csv('orders.csv')
# Тип каждого столбца
df.dtypes
# order_id int64
# user_id int64
# amount float64
# city object
# created_at object
# Подробная сводка: типы + пропуски + потребление памяти
df.info()df.dtypes — быстрая проверка. df.info() — полная картина: количество непустых значений, типы и объём памяти. Если видите object там, где ожидали число или дату — нужна конвертация.
Основные типы данных
| Тип | Что хранит | Пример |
|---|---|---|
int64 |
Целые числа | 1, 42, -7 |
float64 |
Дробные числа (и целые с NaN) | 3.14, NaN |
object |
Строки и смешанные данные | «Москва», «abc123» |
bool |
True / False | True |
datetime64[ns] |
Дата и время | 2026-04-09 12:00:00 |
category |
Категории с фиксированным набором значений | «Москва», «Питер» |
Важный нюанс: int64 не поддерживает пропуски. Если в целочисленном столбце есть NaN, pandas автоматически приведёт его к float64. Подробнее об этом — в разделе про nullable-типы ниже.
Приведение типов: astype
astype() — основной способ изменить тип столбца.
# Строку в число
df['amount'] = df['amount'].astype(float)
# Число в строку
df['user_id'] = df['user_id'].astype(str)
# В булевый тип
df['is_paid'] = df['is_paid'].astype(bool)
# Несколько столбцов сразу
df = df.astype({'user_id': 'int64', 'amount': 'float64'})astype() строгий: если в столбце есть значение, которое не конвертируется (например, строка «N/A» в числовом столбце), он выбросит ошибку. Для таких случаев — pd.to_numeric.
pd.to_numeric — безопасная конвертация в числа
# Строгий режим — ошибка при невалидных значениях (по умолчанию)
df['amount'] = pd.to_numeric(df['amount'])
# errors='coerce' — невалидные значения станут NaN
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
# errors='ignore' — столбец останется без изменений при ошибке
df['amount'] = pd.to_numeric(df['amount'], errors='ignore')errors='coerce' — самый практичный вариант. Числа конвертируются, мусор заменяется на NaN, который потом можно обработать отдельно.
pd.to_datetime — конвертация дат
После загрузки CSV даты часто остаются строками. pd.to_datetime это исправляет:
df['created_at'] = pd.to_datetime(df['created_at'])
# Указать формат явно — быстрее и надёжнее
df['created_at'] = pd.to_datetime(df['created_at'], format='%Y-%m-%d')
# Невалидные даты в NaT (Not a Time)
df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')После конвертации доступны .dt-аксессоры: .dt.year, .dt.month, .dt.dayofweek, .dt.date. Без конвертации в datetime64 эти операции не работают.
Тип category — экономия памяти
Если столбец содержит повторяющиеся строки (город, статус, категория товара), тип category экономит память в разы:
df['city'] = df['city'].astype('category')
# Проверить экономию
df['city'].memory_usage(deep=True)Категории бывают неупорядоченными и упорядоченными:
from pandas.api.types import CategoricalDtype
size_type = CategoricalDtype(
categories=['S', 'M', 'L', 'XL'],
ordered=True
)
df['size'] = df['size'].astype(size_type)
# Теперь можно сравнивать
df[df['size'] > 'M'] # L и XLНа больших датасетах (миллионы строк) category сокращает потребление памяти на 80-90% для строковых столбцов с низкой кардинальностью.
Nullable Integer: Int64 vs int64
Стандартный int64 (с маленькой буквы) не поддерживает NaN — pandas конвертирует столбец в float64. Nullable-тип Int64 (с большой буквы) решает эту проблему:
df['age'] = pd.array([25, None, 32, 28, None], dtype='Int64')
df.dtypes
# age Int64Аналогично работают Int8, Int16, Int32, Float32, Float64, boolean, string. Это расширенные типы pandas, которые корректно обрабатывают пропуски без неожиданных конвертаций.
Частые ошибки
Числа загрузились как object. Обычно из-за мусорных значений в CSV: запятых вместо точек, пробелов, текста «N/A». Проверьте: df[pd.to_numeric(df['col'], errors='coerce').isna()] — покажет проблемные строки.
Сравнение строк с числами. df[df['amount'] > 100] сломается, если amount — это object. Сначала конвертируйте: pd.to_numeric(df['amount'], errors='coerce').
Потеря точности при astype(int). Если в столбце есть NaN, astype(int) упадёт. Сначала заполните пропуски или используйте astype('Int64').
Вопросы с собеседований
Как проверить типы данных в DataFrame?
df.dtypes возвращает тип каждого столбца. df.info() показывает типы, количество непустых значений и потребление памяти.
Чем astype отличается от pd.to_numeric?
astype() — строгая конвертация, падает на невалидных данных. pd.to_numeric() с errors='coerce' заменяет невалидные значения на NaN вместо ошибки.
Почему целочисленный столбец стал float64?
Из-за пропусков. Стандартный int64 не поддерживает NaN, поэтому pandas конвертирует в float64. Решение — nullable-тип Int64.
Зачем нужен тип category? Экономия памяти для столбцов с повторяющимися значениями. Также позволяет задать порядок категорий для сортировки и сравнений.
Как конвертировать строку с датой в datetime?
pd.to_datetime(df['col']). Для явного формата — параметр format. Для обработки ошибок — errors='coerce', невалидные значения станут NaT.
FAQ
Что лучше: astype('int') или pd.to_numeric?
Если данные чистые — astype() быстрее и проще. Если есть сомнения — pd.to_numeric(errors='coerce') безопаснее: не упадёт на мусоре в данных, а заменит его на NaN.
Как конвертировать сразу несколько столбцов?
df.astype({'col1': 'int64', 'col2': 'float64'}) — передайте словарь. Для дат: pd.to_datetime() применяется к каждому столбцу отдельно.
Влияет ли тип данных на скорость вычислений?
Да. Операции над int64 / float64 значительно быстрее, чем над object. Если числовой столбец остался строкой — все агрегации будут медленнее. Тип category тоже ускоряет groupby и фильтрацию.
Что дальше
Типы данных — базовый навык для работы с pandas. Потренируйтесь определять и менять типы на реальных примерах: откройте тренажёр — там задачи на Python с автопроверкой.
Другие гайды по pandas: шпаргалка, read_csv, пропуски в данных. Все примеры вопросов — на странице примеры вопросов, а полный курс подготовки по Python — в разделе Python-тренажёр.