Все типы данных 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).

Типы данных pandas в Python - comments

En
Python pandas типы данных (python)