反转 Pandas 中 CategoricalDtype 的顺序

reverse the order of CategoricalDtype in Pandas

我的数据框中有一个有序的分类变量,如下所示:

CategoricalDtype(categories=['UNDER  000', ' 000 TO 2 999', ' 000 TO 3 999', 
                              '000 - 9999', '0000 OR OVER', 'REFUSED'], 
                               ordered=True)

对于数据框中的 CategoricalIndex 我知道我可以执行以下操作:

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

我尝试了我为 CategoricalDtype 对象找到 here 的方法:

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

但它不起作用并返回:

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

因此,我想知道是否有一种简单的方法可以将 CategoricalDtype 的顺序反转为 Pandas。

如果您只想查找具有反向类别列表的 CategoricalIndex 对象,您可以考虑使用原始实例的反向类别列表创建一个新对象。

如果 x 是您现有的 CategoricalDtype 对象:

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

您可以使用列表切片/NumPy 数组语法,即 [::-1],来反转顺序。这很自然,因为 dtype.categories returns 一个 pd.Index 对象,它有一个底层 NumPy 数组。

from pandas.api.types import CategoricalDtype

dtype = CategoricalDtype(categories=['UNDER  000', ' 000 TO 2 999', ' 000 TO 3 999',
                                     '000 - 9999', '0000 OR OVER', 'REFUSED'],
                         ordered=True)

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

# CategoricalDtype(categories=['REFUSED', '0000 OR OVER', '000 - 9999',
#                   ' 000 TO 3 999', ' 000 TO 2 999', 'UNDER  000'],
#                  ordered=True)

我刚刚发现了另一种方法。

因为 pandas 中的 CategoricalDtype 有一个 attribute cat.categories, we can call it from a variable right away and reserve its order directly by using reversed() or [::-1]. If a pandas Series is categorical, pandas also offers lots of methodscat.set_categories。因此,对于数据框中名为 var 的变量,我们可以执行以下操作:

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

通过使用此方法,我们不必创建 CategoricalDtype 对象或导入任何内容。它还使我们免于使用 .astype() 来替换分类变量中的旧顺序。