Categorical в Pandas

Categorical — это специальный тип данных для столбцов с ограниченным набором значений (например, «red/green/blue» или «low/mid/high»). Внутри Pandas хранит только числовые коды + словарь категорий, что экономит память и ускоряет группировки.

Когда использовать

  • Колонки-классификаторы: модель устройства, статус, тип сенсора.

  • Упорядоченные шкалы: low < mid < high.

  • Подготовка данных для ML, где категориальные признаки требуют явного типа.

Пример 1. Создание

import pandas as pd

s = pd.Series(["red", "green", "blue", "red"], dtype="category")
print(s)
print(s.cat.categories)

Output:

0      red
1    green
2     blue
3      red
dtype: category
Categories (3, object): ['blue', 'green', 'red']
Index(['blue', 'green', 'red'], dtype='object')

Пример 2. Конвертация существующего столбца

import pandas as pd

df = pd.DataFrame({"status": ["ok", "fail", "ok", "ok"]})
df["status"] = df["status"].astype("category")
print(df.dtypes)

Output:

status    category
dtype: object

Пример 3. Упорядоченная категория

import pandas as pd

levels = pd.Categorical(["low", "high", "mid"], categories=["low", "mid", "high"], ordered=True)
s = pd.Series(levels)
print(s.sort_values())

Output:

0     low
2     mid
1    high
dtype: category
Categories (3, object): ['low' < 'mid' < 'high']

Пример 4. Сравнения работают

import pandas as pd

levels = pd.Categorical(["low", "high", "mid"], categories=["low", "mid", "high"], ordered=True)
s = pd.Series(levels)
print(s >= "mid")

Output:

0    False
1     True
2     True
dtype: bool

Пример 5. Экономия памяти

import pandas as pd

s = pd.Series(["A"] * 10000 + ["B"] * 10000)
print("object:", s.memory_usage(deep=True))
print("category:", s.astype("category").memory_usage(deep=True))

Output:

object: 1180132
category: 20302

Категориальный занимает в десятки раз меньше.

Пример 6. Переименование категорий

import pandas as pd

s = pd.Series(["ok", "fail", "ok"], dtype="category")
s2 = s.cat.rename_categories({"ok": "OK", "fail": "ERR"})
print(s2)

Output:

0     OK
1    ERR
2     OK
dtype: category
Categories (2, object): ['ERR', 'OK']

Пример 7. Добавить новую категорию

import pandas as pd

s = pd.Series(["ok", "fail"], dtype="category")
s = s.cat.add_categories(["unknown"])
print(s.cat.categories)

Output:

Index(['fail', 'ok', 'unknown'], dtype='object')

Подводные камни

  • Categorical нельзя присваивать значения вне своих категорий — будет ошибка. Сначала add_categories.

  • После concat категорийные типы иногда сбрасываются в object — проверяйте dtype.

  • Не путайте «упорядоченную категорию» с числовой шкалой — сравнения работают, арифметика — нет.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.