Pandas & NumPy Academy · Урок

Приведение типов с помощью astype()

Преобразуйте столбцы в int, float, string, boolean и datetime с помощью astype() и обрабатывайте распространённые ошибки преобразования.

Урок 2 из 413 шагов

«Приведение типов с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Проверка типов данных столбцов
  2. Приведение типов с помощью astype()
  3. Категориальный тип данных
  4. Корректный разбор дат
← Назад к Pandas & NumPy Academy