обратный порядок КатегориальногоDtype в Пандах - PullRequest
0 голосов
/ 10 октября 2018

У меня есть упорядоченная категориальная переменная в моем фрейме данных, например:

CategoricalDtype(categories=['UNDER $1 000', '$1 000 TO 2 999', '$3 000 TO 3 999', '$90000 - $109999', '$110000 OR OVER', 'REFUSED'], ordered=True)

Для CategoricalIndex в фрейме данных я знаю, что могу сделать следующее:

df.sort_index(ascending=False, inplace=True)

Я попробовал метод, который нашел здесь для CategoricalDtype объекта:

from pandas import Categorical Categorical.sort(ascending=False)

, но это не такt работают и возвращаются:

AttributeError: type object 'Categorical' has no attribute 'sort'.

Таким образом, мне интересно, есть ли простой способ отменить заказ на CategoricalDtype с помощью панд.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Для изменения порядка можно использовать синтаксис списка / массива NumPy, т. Е. [::-1].Это естественно, поскольку dtype.categories возвращает объект pd.Index, который имеет базовый массив NumPy.

from pandas.api.types import CategoricalDtype

dtype = CategoricalDtype(categories=['UNDER $1 000', '$1 000 TO 2 999', '$3 000 TO 3 999',
                                     '$90000 - $109999', '$110000 OR OVER', 'REFUSED'],
                         ordered=True)

dtype_reversed = CategoricalDtype(categories=dtype.categories[::-1], ordered=True)

# CategoricalDtype(categories=['REFUSED', '$110000 OR OVER', '$90000 - $109999',
#                   '$3 000 TO 3 999', '$1 000 TO 2 999', 'UNDER $1 000'],
#                  ordered=True)
0 голосов
/ 12 октября 2018

Я только что нашел другой способ сделать это.

Поскольку CategoricalDtype в pandas имеет атрибут cat.categories, мы можем сразу вызвать его из переменной и зарезервироватьего заказ напрямую с помощью reversed() или [::-1].Если pandas Series категоричен, pandas также предлагает множество методов , таких как cat.set_categories.Таким образом, для переменной с именем var в кадре данных мы можем сделать следующее:

order = df.var.cat.categories[::-1] df.var.cat.set_categories(new_categories=order, ordered=True, inplace=True)

Используя этот метод, нам не нужно создавать CategoricalDtypeвозражать или импортировать что-либо.Это также избавляет нас от использования .astype() для замены старого порядка в категориальной переменной.

0 голосов
/ 10 октября 2018

Если вы ищете только объект CategoricalIndex с обращенным списком категорий, вы можете рассмотреть возможность создания нового объекта с обращенным списком категорий из исходного экземпляра.

, если xваш существующий CategoricalDtype объект:

x_reversed = CategoricalDtype(categories=reversed(x.categories), ordered=True)
...