Категориальный тип данных

Вопрос или проблема

Почему в:

cat = pd.Categorical(
    values=['a', 'b', 'd', 'f'],
    categories=['b', 'a', 'c', 'd', 'e', 'f'],
    ordered=True
)

cat.dtype

Вывод Dtype – это ‘object’, а не ‘category’.

CategoricalDtype(categories=['b', 'a', 'c', 'd', 'e', 'f'], ordered=True, categories_dtype=object)

Но если мы присвоим его серии или df, dtype становится ‘category’?

cs1 = pd.Series(cat)
cs1
0    a
1    b
2    d
3    f
dtype: category
Categories (6, object): ['b' < 'a' < 'c' < 'd' < 'e' < 'f']

Я ожидаю, что вывод будет ‘category’, а не ‘object’

Ответ или решение

Когда вы создаете объект pd.Categorical в Pandas, он принадлежит типу CategoricalDtype, и у него есть свои собственные характеристики, включая категории и порядок. Однако, особенностью этого объекта является то, что его атрибут dtype возвращает тип object, если вы обращаетесь к нему напрямую. Это может вызвать путаницу, особенно если вы ожидаете, что он вернет category.

Давайте рассмотрим ваш код подробнее:

cat = pd.Categorical(
    values=['a', 'b', 'd', 'f'],
    categories=['b', 'a', 'c', 'd', 'e', 'f'],
    ordered=True
)

print(cat.dtype)

При вызове cat.dtype, вы получаете object, потому что в данном контексте cat представляет собой массив, который содержит категории, но сам по себе не является массивом категориального типа, а лишь набором объектов. Это поведение обусловлено тем, что pd.Categorical реализует свои собственные внутренние структуры, и когда вы проверяете dtype непосредственно на объекте Categorical, он интерпретирует его как массив объектов.

Однако, когда вы присваиваете этот Categorical объект серии или DataFrame, тип данных становится category, поскольку Pandas обрабатывает его как категориальный тип, что позволяет использовать более оптимизированные операции и экономить память. Пример с серией подтверждает это:

cs1 = pd.Series(cat)
print(cs1)

В этом случае вы получите вывод, который явно указывает, что тип данных является category. Это поведение показывает, как Pandas работает с различными типами данных: внутреннего и внешнего представления.

Таким образом, резюмируя, cat.dtype возвращает object, потому что cat — это не массив категорий в классическом понимании, а набор объектов в специфическом форматировании. При этом при присваивании его в серию или DataFrame тип данных преобразуется в category, что делает этот объект более подходящим для анализа данных и позволяет использовать всю мощь категориальных переменных в Pandas.

Оцените материал
Добавить комментарий

Капча загружается...