Все типы данных pandas: от object до категориальных и временных
Основные типы данных pandas
Библиотека pandas предлагает несколько встроенных типов данных для хранения различных видов информации. Основные типы: object (строки, смешанные типы), int64/int32 (целые числа), float64 (числа с плавающей точкой), bool (логические), datetime64[ns] (дата и время), timedelta[ns] (разница во времени), category (категориальные данные). Каждый тип оптимизирует память и предоставляет специализированные методы.
Узнать типы столбцов DataFrame можно через атрибут dtypes:
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'salary': [50000.5, 60000.0],
'active': [True, False],
'start_date': ['2020-01-01', '2021-06-15']
})
print(df.dtypes)команды math python (команды модуля math в python)
name object age int64 salary float64 active bool start_date object dtype: object
Aiogram python (создание бота на aiogram (асинхронный telegram бот))
Тип datetime64 не определился автоматически, так как столбец start_date содержит строки. Для работы с датами требуется явное преобразование.
Как определить тип конкретного столбца?
Используется атрибут dtype для Series:
print(df['age'].dtype) # int64
print(df['name'].dtype) # object
библиотека имен python (библиотека имен в python)
Как преобразовать типы данных в pandas?
Метод astype() позволяет изменить тип столбца:
df['age_float'] = df['age'].astype('float64')
print(df.dtypes)Python pandas типы данных (типы данных pandas в python)
name object age int64 salary float64 active bool start_date object age_float float64 dtype: object
Для преобразования строк в даты используется pd.to_datetime():
df['start_date'] = pd.to_datetime(df['start_date'])
print(df.dtypes)name object age int64 salary float64 active bool start_date datetime64[ns] dtype: object
Как обработать ошибки при преобразовании чисел?
Метод pd.to_numeric() с параметром errors='coerce' превращает некорректные значения в NaN:
s = pd.Series(['1', '2', 'три', '4'])
s_num = pd.to_numeric(s, errors='coerce')
print(s_num)0 1.0 1 2.0 2 NaN 3 4.0 dtype: float64
Типичная ошибка: при использовании astype() для столбца с нечисловыми значениями возникает ValueError. Решение – предварительная очистка данных или применение pd.to_numeric.
Ещё одна распространённая проблема – смешанные типы в столбце object. Например, числа и строки вместе. В таких случаях pandas сохраняет всё как object, что замедляет операции. Рекомендуется явно приводить к одному типу или использовать infer_objects().
Как работать с категориальными данными?
Тип category эффективен для столбцов с ограниченным числом уникальных значений. Создаётся через astype('category') или конструктор pd.Categorical():
df['city'] = pd.Categorical(['Moscow', 'SPb', 'Moscow', 'Kazan'])
print(df['city'].dtype) # category
print(df['city'].cat.codes)0 1 1 2 2 1 3 0 dtype: int8
Категориальный тип позволяет сортировать в заданном порядке и экономит память при повторяющихся значениях.
Как выбрать столбцы по типу данных?
Метод select_dtypes() фильтрует столбцы DataFrame по типам:
print(df.select_dtypes(include=['int64', 'float64']))age salary age_float 0 25 50000.5 25.0 1 30 60000.0 30.0
Параметр exclude позволяет исключить определённые типы.
Расширенные примеры работы с типами данных pandas
Ниже приведены подробные примеры с кодом и результатами выполнения.
1. Преобразование строк в дату с разными форматами
import pandas as pd
# Данные с нестандартным форматом даты
dates = ['01/31/2020', '2020-02-01', '2020年03月01日', '2020-04-01 12:30']
s = pd.Series(dates)
# Попытка прямого преобразования может привести к ошибке
# pd.to_datetime(s) # ValueError
# Используем dayfirst и infer_datetime_format
s_dt = pd.to_datetime(s, infer_datetime_format=True, errors='coerce')
print(s_dt)0 2020-01-31 1 2020-02-01 2 NaT 3 2020-04-01 12:30:00 dtype: datetime64[ns]
Обратите внимание: дата в китайском формате (2020年03月01日) не распознана и превратилась в NaT. Для таких случаев требуется ручной парсинг.
2. Использование pd.to_numeric с различными error-режимами
s = pd.Series(['123', '45.6', 'abc', '7.8.9', '100'])
# errors='raise' (по умолчанию) вызовет ошибку
# pd.to_numeric(s) # ValueError
# errors='coerce' – заменяет некорректные на NaN
s_coerce = pd.to_numeric(s, errors='coerce')
print('Coerce:\n', s_coerce)
# errors='ignore' – возвращает исходный Series без изменений
s_ignore = pd.to_numeric(s, errors='ignore')
print('Ignore:\n', s_ignore)Coerce: 0 123.0 1 45.6 2 NaN 3 NaN 4 100.0 dtype: float64 Ignore: 0 123 1 45.6 2 abc 3 7.8.9 4 100 dtype: object
3. Категориальные данные: работа с порядком и добавление категорий
# Создание упорядоченного категориального типа
df = pd.DataFrame({'size': pd.Categorical(['S', 'M', 'L', 'XL', 'M', 'S'],
categories=['S', 'M', 'L', 'XL'],
ordered=True)})
print('Исходный порядок:', df['size'].cat.categories.tolist())
# Сортировка по порядку категорий
df_sorted = df.sort_values('size')
print('Отсортированные значения:')
print(df_sorted['size'].values)
# Добавление новой категории
df['size'] = df['size'].cat.add_categories(['XXL'])
print('Категории после добавления:', df['size'].cat.categories.tolist())Исходный порядок: ['S', 'M', 'L', 'XL'] Отсортированные значения: ['S' 'S' 'M' 'M' 'L' 'XL'] Категории после добавления: ['S', 'M', 'L', 'XL', 'XXL']
4. Изменение типа всех числовых столбцов в DataFrame
df = pd.DataFrame({
'int_col': [1, 2, 3],
'float_col': [1.1, 2.2, 3.3],
'str_col': ['a', 'b', 'c']
})
# Выбор столбцов с числовыми типами и приведение к int32
num_cols = df.select_dtypes(include=['int64', 'float64']).columns
df[num_cols] = df[num_cols].astype('int32')
print(df.dtypes)int_col int32 float_col int32 str_col object dtype: object
Обратите внимание: float32 было бы более естественно для чисел с дробной частью, но пример иллюстрирует возможность смены типа.
5. Проблема смешанных типов и метод infer_objects
# Имитация данных со смешанными типами в столбце object
df = pd.DataFrame({
'mixed': [1, '2', 3.0, '4.5', None]
})
print('Исходные типы:', df['mixed'].dtype) # object
# После операций, pandas может угадать типы
df2 = df['mixed'].dropna().astype(str).apply(pd.to_numeric, errors='coerce')
print('Приведённый тип:', df2.dtype) # float64
# infer_objects пытается преобразовать объектный тип в более подходящий
df['mixed'] = df['mixed'].infer_objects()
print('После infer_objects:', df['mixed'].dtype) # object, так как есть None и смесьИсходные типы: object Приведённый тип: float64 После infer_objects: object
infer_objects() пытается угадать тип, но не может обработать смешанные данные. Для полного преобразования требуется явное приведение.
6. Использование memory_usage для оценки эффективности типов
import numpy as np
# Создаём DataFrame с разными типами
df = pd.DataFrame({
'int64': np.random.randint(0, 100, size=1000),
'category': pd.Categorical(np.random.choice(['A','B','C'], size=1000)),
'object': ['str_' + str(i) for i in range(1000)]
})
print('Потребление памяти (байт):')
print(df.memory_usage(deep=True))Потребление памяти (байт): Index 128 int64 8000 category 1056 object 61072 dtype: int64
Видно, что категориальный тип значительно экономит память по сравнению с object (1056 байт против 61072).