Astype: примеры (PYTHON)

Метод astype в Python: преобразование типов данных в Pandas и NumPy
Раздел: NumPy/Pandas, Преобразование типов
astype(dtype[, order, casting, subok, copy]): ndarray

Описание метода astype

Метод astype() применяется в библиотеках Pandas и NumPy для преобразования типов данных в массивах, сериях или DataFrame. Основное назначение заключается в изменении типа данных элементов структуры на другой совместимый тип.

Основные случаи использования:

  • Преобразование строковых данных в числовые типы для математических операций
  • Изменение типов данных для экономии памяти
  • Приведение данных к единому типу перед анализом
  • Подготовка данных для машинного обучения
  • Преобразование категориальных данных

Аргументы метода в Pandas:

  • dtype - целевой тип данных (обязательный)
  • copy - создание копии данных (по умолчанию True)
  • errors - обработка ошибок ('raise', 'ignore')

Аргументы метода в NumPy:

  • dtype - целевой тип данных
  • order - порядок байтов
  • casting - правила преобразования
  • subok - возврат подклассов
  • copy - создание копии

Метод возвращает новый объект с преобразованными типами данных, если не указан параметр copy=False.

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

Преобразование целых чисел в числа с плавающей точкой:

import pandas as pd
import numpy as np

# Пример с Pandas Series
s = pd.Series([1, 2, 3, 4])
print('Исходные данные:')
print(s)
print('\nПосле преобразования:')
print(s.astype('float64'))
Исходные данные:
0    1
1    2
2    3
3    4
dtype: int64

После преобразования:
0    1.0
1    2.0
2    3.0
3    4.0
dtype: float64

Преобразование с обработкой ошибок:

# Пример с ошибками
s = pd.Series(['1', '2', 'abc', '4'])
print('Без обработки ошибок:')
try:
    print(s.astype('int', errors='raise'))
except Exception as e:
    print(f'Ошибка: {type(e).__name__}')
print('\nС игнорированием ошибок:')
print(s.astype('int', errors='ignore'))
Без обработки ошибок:
Ошибка: ValueError

С игнорированием ошибок:
0      1
1      2
2    abc
3      4
dtype: object

Альтернативные методы в Python

pd.to_numeric()

Специализированная функция для преобразования в числовые типы с расширенной обработкой ошибок. Поддерживает параметр errors='coerce' для замены некорректных значений на NaN.

pd.to_datetime()

Преобразование в тип datetime с автоматическим распознаванием форматов дат.

pd.to_timedelta()

Конвертация данных в интервалы времени.

np.asarray()

Создание массива NumPy с указанием типа данных, но без гарантии копирования.

Выбор метода зависит от конкретной задачи: astype подходит для гарантированного преобразования известных типов, to_numeric - для обработки разнородных числовых данных, to_datetime - для работы с датами.

Аналоги в других языках программирования

JavaScript:

// Явное преобразование типов
let str = "123";
let num = Number(str); // 123
let bool = Boolean(str); // true
let str2 = String(num); // "123"
console.log(num, bool, str2);
123 true "123"

Java:

// Преобразование через методы классов-оберток
String str = "123";
int num = Integer.parseInt(str);
double d = Double.parseDouble("123.45");
System.out.println(num + ", " + d);
123, 123.45

SQL:

-- Функции CAST и CONVERT
SELECT CAST('123' AS INT) as num,
       CONVERT(DECIMAL(10,2), '123.45') as decimal_num;

C#:

// Методы Convert и Parse
string str = "123";
int num = Convert.ToInt32(str);
double d = double.Parse("123.45");
Console.WriteLine($"{num}, {d}");
123, 123.45

Типичные ошибки при использовании

Попытка преобразования несовместимых типов данных:

import pandas as pd

s = pd.Series(['текст', 'еще текст'])
try:
    result = s.astype('int')
except Exception as e:
    print(f'{type(e).__name__}: {e}')
ValueError: invalid literal for int() with base 10: 'текст'

Потеря данных при преобразовании:

import numpy as np

arr = np.array([1.8, 2.7, 3.6])
result = arr.astype('int32')
print('Исходный массив:', arr)
print('После преобразования:', result)
Исходный массив: [1.8 2.7 3.6]
После преобразования: [1 2 3]

Проблемы с большими числами:

import pandas as pd

s = pd.Series([9999999999])  # Большое число для int32
print('Исходный тип:', s.dtype)
result = s.astype('int32')
print('После преобразования:', result.values)
Исходный тип: int64
После преобразования: [1410065407]

Изменения в последних версиях

В Pandas 2.0 появилась поддержка nullable-типов данных (Int64, Float64, boolean, string), которые могут содержать значения NaN. Это улучшило обработку пропущенных значений.

import pandas as pd

# Новые nullable-типы в Pandas 2.0+
s = pd.Series([1, 2, None, 4], dtype='Int64')
print(s)
print('Тип данных:', s.dtype)
0       1
1       2
2    
3       4
dtype: Int64
Тип данных: Int64

В NumPy 1.20 улучшена обработка преобразований между разными типами данных с использованием параметра casting.

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

Преобразование категориальных данных с оптимизацией памяти:

Пример python
import pandas as pd
import sys

# Большой набор строковых данных
categories = ['category_A', 'category_B', 'category_C'] * 1000
df = pd.DataFrame({'cat': categories})
print('Исходный размер памяти:')
print(df.memory_usage(deep=True))

# Преобразование в категориальный тип
df['cat'] = df['cat'].astype('category')
print('\nПосле оптимизации:')
print(df.memory_usage(deep=True))
Исходный размер памяти:
Index      128
cat     240000
dtype: int64

После оптимизации:
Index      128
cat       4016
dtype: int64

Пакетное преобразование типов в DataFrame:

Пример python
import pandas as pd
import numpy as np

# Создание DataFrame с разными типами данных
df = pd.DataFrame({
    'A': ['1', '2', '3'],
    'B': [1.1, 2.2, 3.3],
    'C': ['2023-01-01', '2023-01-02', '2023-01-03']
})

# Преобразование нескольких столбцов
type_dict = {'A': 'int32', 'B': 'int32', 'C': 'datetime64[ns]'}
df = df.astype(type_dict)
print(df.dtypes)
A             int32
B             int32
C    datetime64[ns]
dtype: object

Использование с пользовательскими типами данных:

Пример python
import pandas as pd

# Пользовательское преобразование через словарь
mapping = {'да': True, 'нет': False, 'неизвестно': None}
s = pd.Series(['да', 'нет', 'неизвестно', 'да'])
result = s.astype('object').map(mapping)
print(result)
0        True
1       False
2        None
3        True
dtype: object

питон astype function comments

En
Astype Convert array type