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.