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
df['user_id'].astype('Int64').head(3)
Результат:
0 42 1 <NA> 2 88 Name: user_id, dtype: Int64
df['channel'] = df['channel'].astype('category')
df['channel'].dtype
Результат:
CategoryDtype(categories=['ads', 'organic', 'referral'], ordered=False)Порешать Python-задачи в тренажёре →
Нужен при чтении сырых выгрузок, где числа пришли строками, для сжатия датафрейма через category и для явного контроля типов перед join. На собеседовании спрашивают, почему float с NaN не приводится к int и что такое Int64.
Обычный int64 не умеет хранить пропуски, поэтому наличие NaN вызывает ошибку. Решение — nullable-тип 'Int64' с большой буквы, где пропуск отображается как <NA>. Либо сначала заполните пропуски через fillna.
astype хорош для чистых данных, где вы уверены в приводимости. Для грязных строк с мусором берите pd.to_numeric и pd.to_datetime — у них есть errors='coerce', превращающий непарсящиеся значения в NaN. astype такой мягкой обработки не даёт.
Тип category хранит значения как коды плюс справочник категорий, что экономит память на колонках с малым числом уникальных значений (каналы, статусы). Это ускоряет groupby и сравнения. На высокой кардинальности выигрыша нет и может стать хуже.
Pandas: основы · NumPy векторизация
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →