Тип 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()}")
# Создание категориальных данных
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)
# Использование 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())
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())
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())
# Создать упорядоченные категории
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())
# Имитация данных об уровне пользователей
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}%")
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}%")
Другие расширенияКогда в данных много повторяющихся строковых значений, использование категориального типа может значительно сократить потребление памяти, что делает его особенно подходящим для больших наборов данных.