astype() в pandas — приведение типов данных колонок

astype() меняет тип колонки или Series: строку в число, float в int, object в category. Аналитику это нужно, чтобы корректно считать метрики, экономить память на низкокардинальных признаках и избегать ошибок сортировки строк-чисел. Можно передать словарь, чтобы привести сразу несколько колонок к разным типам.

Синтаксис

DataFrame.astype(dtype, copy=True, errors='raise')

Примеры использования

Пример 1: Привести несколько колонок словарём

df = df.astype({'user_id': 'int64', 'channel': 'category', 'amount': 'float64'})
df[['user_id', 'channel', 'amount']].dtypes

Результат:

user_id       int64
channel    category
amount      float64
dtype: object

Пример 2: Nullable-инт, когда есть пропуски

df['user_id'].astype('Int64').head(3)

Результат:

0      42
1    <NA>
2      88
Name: user_id, dtype: Int64

Пример 3: object в category ради памяти

df['channel'] = df['channel'].astype('category')
df['channel'].dtype

Результат:

CategoryDtype(categories=['ads', 'organic', 'referral'], ordered=False)
Порешать Python-задачи в тренажёре →

Типичная ошибка

astype('int64') падает, если в колонке есть NaN — используйте nullable-тип 'Int64' (с большой буквы). Для разбора грязных строк в числа и даты лучше подходят pd.to_numeric и pd.to_datetime с обработкой ошибок, а не astype. Метод возвращает копию, а category сильно экономит память только на низкой кардинальности.

Где спрашивают на собеседовании

Нужен при чтении сырых выгрузок, где числа пришли строками, для сжатия датафрейма через category и для явного контроля типов перед join. На собеседовании спрашивают, почему float с NaN не приводится к int и что такое Int64.

FAQ: частые вопросы про astype

Почему astype('int') выдаёт ошибку из-за NaN?

Обычный int64 не умеет хранить пропуски, поэтому наличие NaN вызывает ошибку. Решение — nullable-тип 'Int64' с большой буквы, где пропуск отображается как <NA>. Либо сначала заполните пропуски через fillna.

Когда использовать astype, а когда to_numeric или to_datetime?

astype хорош для чистых данных, где вы уверены в приводимости. Для грязных строк с мусором берите pd.to_numeric и pd.to_datetime — у них есть errors='coerce', превращающий непарсящиеся значения в NaN. astype такой мягкой обработки не даёт.

Зачем приводить колонку к category?

Тип category хранит значения как коды плюс справочник категорий, что экономит память на колонках с малым числом уникальных значений (каналы, статусы). Это ускоряет groupby и сравнения. На высокой кардинальности выигрыша нет и может стать хуже.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы · NumPy векторизация

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →