Вопрос или проблема
Почему в:
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.