Приведение типов с помощью astype()
Преобразуйте столбцы в int, float, string, boolean и datetime с помощью astype() и обрабатывайте распространённые ошибки преобразования.
«Приведение типов с помощью astype()» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Введение в astype()
Series.astype(dtype) преобразует столбец из текущего типа в указанный Вами тип. Он возвращает новый Series (или DataFrame при вызове для целого DataFrame), не изменяя исходный объект. Это основной инструмент Pandas для исправления проблем с типами данных после загрузки данных; с его помощью можно преобразовывать числовые типы, строки, логические значения и тип Categorical.
import pandas as pd
df = pd.DataFrame({'age': ['25', '30', '35']})
print('Before:', df['age'].dtype) # object
df['age'] = df['age'].astype(int)
print('After:', df['age'].dtype) # int64
print(df['age'] + 1) # [26, 31, 36] — arithmetic now worksПреобразование к числовым типам
Чаще всего выполняется преобразование из object в числовой тип. Можно привести данные к 'int64', 'int32', 'float64', 'float32' и другим типам. Если какое-либо значение столбца нельзя преобразовать, astype() вызывает ValueError. Если столбец может содержать нечисловые строки, вместо этого используйте pd.to_numeric(series, errors='coerce'): он заменяет некорректные значения на NaN, а не завершает выполнение с ошибкой.
import pandas as pd
df = pd.DataFrame({'price': ['10.5', '20.0', 'N/A', '30.5']})
# astype would crash on 'N/A'
# price_float = df['price'].astype(float) # ValueError!
# pd.to_numeric with errors='coerce' is safer
df['price_float'] = pd.to_numeric(df['price'], errors='coerce')
print(df)
# price price_float
# 0 10.5 10.5
# 1 20.0 20.0
# 2 N/A NaN
# 3 30.5 30.5Преобразование в строки (object)
Приведение столбца к str (или 'object') преобразует каждое значение в его строковое представление. Это полезно, когда нужно объединить числовой столбец с текстовым или применить строковые методы к числовым данным, например добавить нули в начале идентификаторов. В Pandas также есть более новый тип данных 'string', который лучше обрабатывает NA в текстовых столбцах.
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'region': ['E', 'W', 'N']})
# Concatenate id and region into a composite key
df['key'] = df['id'].astype(str) + '_' + df['region']
print(df)
# id region key
# 0 1 E 1_E
# 1 2 W 2_W
# 2 3 N 3_NПреобразование в логический тип
Преобразование в логический тип полезно, когда столбцы хранят значения True/False как целые числа (0/1) или строки ('Yes'/'No'). Приведение целых чисел 0/1 с помощью astype(bool) выполняется напрямую: 0 становится False, а любое ненулевое значение — True. Для столбцов со строками 'Yes'/'No' сначала выполните map со словарём, а затем приведите результат к логическому типу.
import pandas as pd
df = pd.DataFrame({
'active_int': [1, 0, 1, 0],
'active_str': ['Yes', 'No', 'Yes', 'No']
})
# Integer to bool
df['active_bool'] = df['active_int'].astype(bool)
# String to bool via mapping
df['active_bool2'] = df['active_str'].map({'Yes': True, 'No': False})
print(df[['active_bool', 'active_bool2']])
# active_bool active_bool2
# 0 True True
# 1 False FalseУменьшение разрядности числовых типов
По умолчанию Pandas использует 64-битные типы. Если Ваши целочисленные значения помещаются в 32 или даже 8 бит, можно уменьшить разрядность до меньшего типа и сократить использование памяти в два или четыре раза. Используйте pd.to_numeric(series, downcast='integer') или явно выполните преобразование с помощью astype('int32'). Это важная оптимизация для больших наборов данных.
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': np.random.randint(0, 200, 1_000_000)})
print('int64 bytes:', df['count'].nbytes) # 8,000,000
df['count_int16'] = df['count'].astype('int16') # max 32767, fits 0-200
print('int16 bytes:', df['count_int16'].nbytes) # 2,000,000
# Or let Pandas choose the smallest type automatically
df['count_auto'] = pd.to_numeric(df['count'], downcast='integer')
print('auto dtype:', df['count_auto'].dtype)Преобразование целых DataFrame с помощью astype(dict)
Вы можете преобразовать сразу несколько столбцов, передав в df.astype() словарь, где ключами являются имена столбцов, а значениями — целевые типы данных. Это понятнее, чем последовательно присваивать отдельные столбцы, и позволяет оформить шаг преобразования типов как единый, самодокументируемый блок конвейера.
import pandas as pd
df = pd.DataFrame({
'age': ['25', '30'],
'salary': ['50000', '70000'],
'is_manager': ['1', '0']
})
df = df.astype({
'age': 'int32',
'salary': 'float64',
'is_manager': 'bool'
})
print(df.dtypes)
# age int32
# salary float64
# is_manager boolОбработка ошибок в astype()
В astype() нет встроенного режима терпимой обработки ошибок, в отличие от pd.to_numeric. Если преобразование завершается неудачно, вызывается ValueError или OverflowError. Безопасный порядок действий таков: (1) сначала очистить столбец — удалить символы и заполнить NaN; (2) затем выполнить преобразование. В качестве альтернативы для числовых данных используйте pd.to_numeric(errors='coerce') или напишите небольшую вспомогательную функцию, которая перехватывает ошибки преобразования.
import pandas as pd
# Clean then cast pattern
df = pd.DataFrame({'price': ['$1,200', '$800', '$450']})
# Step 1: remove non-numeric characters
df['price_clean'] = (
df['price']
.str.replace('$', '', regex=False)
.str.replace(',', '', regex=False)
)
# Step 2: safe cast
df['price_num'] = df['price_clean'].astype(float)
print(df)
# price price_clean price_num
# 0 $1,200 1200 1200.0
# 1 $800 800 800.0
# 2 $450 450 450.0Приведение к Pandas StringDtype
Более новый тип данных 'string' (вариант с заглавной S или pd.StringDtype()) был введён для полноценной поддержки строк и корректной обработки NA: пропущенные строки хранятся как pd.NA, а не как None или np.nan. Он предоставляет доступ к .str, лучше сохраняет семантику NA, чем тип object, и рекомендуется для нового кода, предназначенного для Pandas 2 и более поздних версий.
import pandas as pd
df = pd.DataFrame({'name': ['Alice', None, 'Carol']})
# Convert to the modern string dtype
df['name'] = df['name'].astype('string')
print(df['name'].dtype) # string
print(df['name'].isna()) # proper NA detection
# 0 False
# 1 True
# 2 FalseРиск переполнения при уменьшении разрядности
При приведении к меньшему целочисленному типу значения, выходящие за пределы его диапазона, незаметно переполняются и переходят по кругу. Например, преобразование 300 к int8 (диапазон от -128 до 127) даёт 44 без возникновения ошибки. Перед уменьшением разрядности всегда проверяйте, что фактический диапазон данных помещается в целевой тип, чтобы избежать незаметного искажения данных.
import pandas as pd
import numpy as np
df = pd.DataFrame({'value': [100, 200, 300, 127, 128]})
# int8 range: -128 to 127
df['value_i8'] = df['value'].astype('int8')
print(df)
# value value_i8
# 0 100 100
# 1 200 -56 <- overflow! 200-256 = -56
# 2 300 44 <- overflow! 300-256 = 44
# 3 127 127
# 4 128 -128 <- overflow!
# Always check range first
print(df['value'].max()) # 300 > 127 — int8 is UNSAFE hereПроверка преобразований с помощью карты типов данных
После выполнения нескольких преобразований типов проверьте итоговую схему, сравнив фактические типы данных с ожидаемой картой. Такой шаблон проверки обнаруживает ошибки, например ситуацию, когда столбец не удалось преобразовать из-за того, что NaN препятствовал преобразованию в целое число. Выполняйте эти проверки в конце функции загрузки данных как лёгкий тест схемы.
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 3],
'amount': [10.5, 20.0, 30.5],
'active': [True, False, True]
})
expected = {'user_id': 'int64', 'amount': 'float64', 'active': 'bool'}
for col, dtype in expected.items():
assert str(df[col].dtype) == dtype, (
f'{col}: expected {dtype}, got {df[col].dtype}'
)
print('Schema validation passed')Пример полного конвейера преобразования
Объединим всё вместе: ниже приведён реалистичный конвейер преобразования после чтения CSV, который очищает форматирование, безопасно обрабатывает NaN, приводит данные к оптимальным типам и проверяет результат. Этот шаблон — очистить, преобразовать, проверить — должен быть стандартной частью каждой функции загрузки данных.
import pandas as pd
raw = pd.DataFrame({
'user_id': ['101', '102', '103'],
'revenue': ['$1,200', '$800', '$2,500'],
'active': ['Yes', 'No', 'Yes']
})
df = (
raw
.assign(
user_id=raw['user_id'].astype('int32'),
revenue=pd.to_numeric(
raw['revenue'].str.replace('[$,]', '', regex=True)
),
active=raw['active'].map({'Yes': True, 'No': False})
)
)
print(df.dtypes)
# user_id int32
# revenue float64
# active boolБыстрая проверка
Проверьте, насколько хорошо Вы понимаете приведение типов с помощью astype().
Итоги урока
В этом уроке Вы узнали: astype(dtype) преобразует столбец или целый DataFrame в новый тип, pd.to_numeric(errors='coerce') безопаснее использовать для столбцов с нечисловыми строками, а передача словаря в astype() позволяет преобразовать сразу несколько столбцов. Осторожно уменьшайте разрядность, чтобы избежать переполнения, и всегда проверяйте итоговую схему с помощью проверок. Далее мы изучим экономичный по памяти тип данных Categorical.
Изучай Python с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Приведение типов с помощью astype()» бесплатный?
Да — полный текст урока «Приведение типов с помощью astype()» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Приведение типов с помощью astype()»?
Преобразуйте столбцы в int, float, string, boolean и datetime с помощью astype() и обрабатывайте распространённые ошибки преобразования. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Приведение типов с помощью astype()»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проверка типов данных столбцов
- Приведение типов с помощью astype()
- Категориальный тип данных
- Корректный разбор дат