Работа с типами столбцов pandas: от просмотра до преобразования

Раздел: Data Science -> Pandas и NumPy

Типы данных столбцов в 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]
- методы анализа данных python (методы анализа данных в python)
- Python для анализа данных обучение (обучение анализу данных на python)
- первичный анализ данных python (первичный анализ данных в python)

Расширенные примеры работы с типами данных в 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() или явный вызов.

тип данных столбца в pandas - comments

En
тип столбца python (python)