反转 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 methods 像 cat.set_categories
。因此,对于数据框中名为 var
的变量,我们可以执行以下操作:
order = df.var.cat.categories[::-1]
df.var.cat.set_categories(new_categories=order, ordered=True, inplace=True)
通过使用此方法,我们不必创建 CategoricalDtype
对象或导入任何内容。它还使我们免于使用 .astype()
来替换分类变量中的旧顺序。
我的数据框中有一个有序的分类变量,如下所示:
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 methods 像 cat.set_categories
。因此,对于数据框中名为 var
的变量,我们可以执行以下操作:
order = df.var.cat.categories[::-1]
df.var.cat.set_categories(new_categories=order, ordered=True, inplace=True)
通过使用此方法,我们不必创建 CategoricalDtype
对象或导入任何内容。它还使我们免于使用 .astype()
来替换分类变量中的旧顺序。