Работа с типами столбцов pandas: от просмотра до преобразования
Типы данных столбцов в pandas: получение и преобразование
Каждый столбец DataFrame в pandas имеет свой тип данных (dtype). Правильное определение и изменение типов позволяет ускорить вычисления, сократить расход памяти и избежать ошибок при анализе. Ниже рассмотрены основные методы работы с типами столбцов.
Основной подход: использование атрибута .dtypes и метода .astype()
Атрибут .dtypes возвращает Series с типами всех столбцов. Метод .astype() позволяет явно преобразовать тип одного или нескольких столбцов. Это наиболее прямой и часто применяемый способ.
import pandas as pd
df = pd.DataFrame({'числа': ['1', '2', '3'], 'вещественные': ['4.5', '6.7', '8.9']})
print('Исходные типы:')
print(df.dtypes)
df['числа'] = df['числа'].astype(int)
df['вещественные'] = df['вещественные'].astype(float)
print('После преобразования:')
print(df.dtypes)Python для анализа данных (python для анализа данных)
Исходные типы: числа object вещественные object dtype: object После преобразования: числа int64 вещественные float64 dtype: object
анализ больших данных python (анализ больших данных в python)
Этот способ подходит, когда типы известны заранее и данные можно привести без потерь.
Как получить тип только одного столбца?
Используйте атрибут .dtype (без 's') для конкретного столбца:
print(df['числа'].dtype) # int64
Python анализ данных excel (анализ данных excel в python)
Проблема: путаница между .dtype и .dtypes
Новички часто пишут df.dtype (без 's') для всего DataFrame, что вызывает ошибку AttributeError. Для DataFrame используйте .dtypes, для Series – .dtype. Решение: запомнить различие или пользоваться df.dtypes для получения всех типов сразу.
Как изменить тип с автоматическим определением?
Метод .convert_dtypes() пытается преобразовать столбцы к наиболее подходящим типам (например, из object в int или bool). Полезен после загрузки данных из файлов:
df2 = df.convert_dtypes()
print(df2.dtypes)анализ данных python pdf (анализ данных pdf в python)
числа Int64 вещественные Float64 dtype: object
Python анализ данных и машинное обучение (анализ данных и машинное обучение на python)
Обратите внимание: pandas использует nullable-типы (с пропущенными значениями). Это удобно, если в данных есть NaN.
Как обработать строки, содержащие числа и ошибки?
Функция pd.to_numeric() с параметром errors='coerce' преобразует строки в числа, заменяя неконвертируемые значения на NaN:
import numpy as np
data = pd.Series(['1', '2', 'abc', '4.5'])
numeric = pd.to_numeric(data, errors='coerce')
print(numeric)анализ данных с использованием python (анализ данных с использованием python)
0 1.0 1 2.0 2 NaN 3 4.5 dtype: float64
Python анализ текстовых данных (анализ текстовых данных в python)
Ошибка: ValueError при использовании .astype() для грязных данных
Если в столбце есть нечисловые значения, .astype(int) вызовет ошибку. Решение: предварительно очистить данные с помощью pd.to_numeric() или применить pd.to_numeric(errors='coerce').
Как изменить тип на категориальный?
Категориальный тип (category) экономит память при повторяющихся текстовых значениях. Преобразование:
df['категория'] = pd.Categorical(['A', 'B', 'A', 'C'])
print(df['категория'].dtype) # categoryаналитик данных python sql (аналитик данных python sql)
Это ускоряет группировки и фильтрацию по категориям.
Как преобразовать несколько столбцов одновременно?
Методу .astype() можно передать словарь {столбец: тип}:
df = df.astype({'числа': 'int64', 'вещественные': 'float32'})
print(df.dtypes)Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)
Такой подход эффективен, когда требуется изменить типы нескольких столбцов за один вызов.
Проблема: потеря данных при преобразовании float в int
Явное приведение float к int через .astype(int) обрезает дробную часть без предупреждения. Это может привести к неожиданным результатам. Решение: округлить сначала через .round(), затем преобразовать.
s = pd.Series([1.7, 2.3, 3.9])
print(s.astype(int)) # [1, 2, 3]
print(s.round().astype(int)) # [2, 2, 4]
Расширенные примеры работы с типами данных в pandas
1. Использование категориальных типов для оптимизации памяти
При большом количестве повторяющихся строковых значений категориальный тип может сократить использование памяти в несколько раз.
import pandas as pd
import numpy as np
# Создадим DataFrame с повторяющимися строками
n = 100000
data = {'city': np.random.choice(['Moscow', 'Saint Petersburg', 'Novosibirsk', 'Yekaterinburg', 'Kazan'], n),
'value': np.random.randn(n)}
df = pd.DataFrame(data)
print('Память с object:', df.memory_usage(deep=True).sum())
df['city'] = df['city'].astype('category')
print('Память с category:', df.memory_usage(deep=True).sum())
Память с object: 8000000 bytes Память с category: 1252000 bytes
Экономия существенна. Однако категориальный тип не подходит, если значения уникальны или часто меняются.
2. Работа с датами: pd.to_datetime()
Столбцы с датами часто загружаются как object. Преобразование в datetime ускоряет сортировку и временные срезы.
dates = pd.Series(['2023-01-15', '2023-02-28', '2023-12-31'])
dates_dt = pd.to_datetime(dates)
print(dates_dt)
print(dates_dt.dtype) # datetime64[ns]
0 2023-01-15 1 2023-02-28 2 2023-12-31 dtype: datetime64[ns]
Функция автоматически распознаёт многие форматы. Если возникают ошибки, используйте параметр format или dayfirst.
3. Проверка типов с помощью pd.api.types
Модуль pd.api.types содержит функции для проверки, является ли столбец определённым типом.
s_int = pd.Series([1, 2, 3])
s_float = pd.Series([1.0, 2.0])
s_str = pd.Series(['a', 'b'])
print(pd.api.types.is_integer_dtype(s_int)) # True
print(pd.api.types.is_float_dtype(s_float)) # True
print(pd.api.types.is_string_dtype(s_str)) # True
print(pd.api.types.is_object_dtype(s_str)) # True (это тоже object)
Это полезно для условных преобразований: например, привести все числовые столбцы к float32.
4. Преобразование типов с обработкой ошибок через цикл
Когда типы столбцов неизвестны, можно попробовать преобразовать каждый столбец к числу или дате, игнорируя ошибки.
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['x', 'y', 'z'], 'c': ['2023-01-01', '2023-02-01', '2023-03-01']})
for col in df.columns:
try:
df[col] = pd.to_numeric(df[col], errors='ignore')
if df[col].dtype == 'object':
df[col] = pd.to_datetime(df[col], errors='ignore')
except:
pass
print(df.dtypes)
a int64 b object c datetime64[ns] dtype: object
Такой подход помогает автоматически определить подходящие типы, но может быть медленным на больших данных.
5. Использование .infer_objects() для дообучения типов
Метод .infer_objects() пытается уточнить типы object-столбцов, если они содержат только однородные данные.
df_mixed = pd.DataFrame({'x': [1, 2, 3], 'y': [1.0, 2.5, 3.8]}, dtype='object')
print(df_mixed.dtypes) # оба object
df_inferred = df_mixed.infer_objects()
print(df_inferred.dtypes) # x int64, y float64
x object y object dtype: object x int64 y float64 dtype: object
Метод работает только если данные уже приведены к одному типу внутри столбца. Он не конвертирует строки, содержащие числа - для этого нужен .convert_dtypes() или явный вызов.