Тип Categorical в Pandas

Categorical — это тип данных в Pandas, используемый для обработки конечных значений категорий, особенно подходящий для обработки перечислимых данных, таких как пол, образование, уровень и т. д. Категориальный тип может значительно сократить использование памяти и повысить производительность вычислений.


Создание категориальных данных

Создание из Series

Пример

import pandas as pd

# Создание категориальных данных
s = pd.Series(["Male", "Female", "Male", "Female", "Male"], dtype="category")
print("Basic categorical data:")
print(s)
print(f"Type: {s.dtype}")
print()

# Указание порядка категорий
s2 = pd.Series(
    ["Low", "Medium", "High", "Medium", "Low"],
    dtype=pd.CategoricalDtype(categories=["Low", "Medium", "High"], ordered=True)
)
print("Упорядоченные категории:")
print(s2)
print(f"Порядок категорий: {s2.dtype.categories.tolist()}")

Создание из списка

Пример

import pandas as pd

# Использование pd.Categorical
categories = pd.Categorical(
    ["A", "B", "A", "C", "B"],
    categories=["A", "B", "C"]
)

s = pd.Series(categories)
print("Создание из Categorical:")
print(s)

Атрибуты и методы категорий

Доступ к информации о категориях

Пример

import pandas as pd

s = pd.Series(
    ["Low", "Medium", "High", "Medium", "Low"],
    dtype=pd.CategoricalDtype(categories=["Low", "Medium", "High"], ordered=True)
)

# Атрибуты категорий
print(f"Категории: {s.dtype.categories.tolist()}")
print(f"Упорядочено: {s.dtype.ordered}")
print()

# Подсчитать количество каждой категории
print("Статистика категорий:")
print(s.value_counts())

Изменение категорий

Пример

import pandas as pd

s = pd.Series(["A", "B", "C", "A", "B"], dtype="category")

print("Изменение названий категорий:")
s2 = s.cat.rename_categories({"A": "Excellent", "B": "Good", "C": "Pass"})
print(s2)
print()

# Добавить новую категорию
print("Добавление категории:")
s3 = s.cat.add_categories(["D"])
print(s3.dtype.categories.tolist())
print()

# Удалить категорию
print("Удалить категорию:")
s4 = s.cat.remove_categories(["C"])
print(s4.dtype.categories.tolist())

Упорядоченные категории

Упорядоченные категории поддерживают операции сравнения и подходят для категориальных данных с порядком по величине.

Пример

import pandas as pd

# Создать упорядоченные категории
s = pd.Series(
    ["Низкий", "Средний", "Высокий", "Высокий", "Низкий", "Средний"],
    dtype=pd.CategoricalDtype(categories=["Low", "Medium", "High"], ordered=True)
)

# Операции сравнения
print("Высокий > Средний:", s > "Средний")
print("Средний > Низкий:", s > "Низкий")
print()

# Сортировка
print("После сортировки:")
print(s.sort_values())

Практика: Группировка данных

Пример

import pandas as pd

# Имитация данных об уровне пользователей
users = pd.DataFrame({
    "ID пользователя": range(1, 1001),
    "Уровень": pd.Categorical(
        ["VIP"] * 100 + ["Золотая карта"] * 300 + ["Серебряная карта"] * 400 + ["Обычный"] * 200,
        categories=["Обычный", "Серебряная карта", "Золотая карта", "VIP"],
        ordered=True
    ),
    "Consumption Amount": [1000, 500, 100, 50] * 250
})

print("Распределение уровней пользователей:")
print(users["Level"].value_counts().sort_index())
print()

# Групповая статистика по уровню
print("Статистика по уровню:")
print(users.groupby("Level", observed=True)["Consumption Amount"].sum())

Оптимизация памяти

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

Пример

import pandas as pd
import numpy as np

# Создание большого количества повторяющихся строковых данных
np.random.seed(42)
s_str = pd.Series(np.random.choice(["Пекин", "Шанхай", "Гуанчжоу", "Шэньчжэнь"], 1000000))

# Преобразование в категориальный тип
s_cat = s_str.astype("category")

# Сравнение памяти
print(f"Память строкового типа: {s_str.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Память категориального типа: {s_cat.memory_usage(deep=True) / 1024 / 1024:.2f} MB")
print(f"Сэкономлено: {(1 - s_cat.memory_usage(deep=True) / s_str.memory_usage(deep=True)) * 100:.1f}%")

Когда в данных много повторяющихся строковых значений, использование категориального типа может значительно сократить потребление памяти, что делает его особенно подходящим для больших наборов данных.

Другие расширения