pandas pd.Categorical和pd.API.types.CategoricalDtype之间的区别

ppcbkaq5  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(124)

已编辑

基于到目前为止的回答(谢谢),我理解了CategoricalDType是什么以及它的用途。Categorical/分类数组是什么?它有一个常见的用例吗?

我不明白pd.Categoricalpd.api.types.CategoricalDtype之间的区别。后者返回一个CategoricalDType示例,前者返回一个Categories示例。什么是Categorical对象?它们有什么区别?它们有什么关系?什么时候我应该使用一个而不是另一个?

type(pd.Categorical(['a','b'],ordered=True))
Out[187]: pandas.core.arrays.categorical.Categorical

type(pd.api.types.CategoricalDtype(['a','b'], ordered=True))
Out[188]: pandas.core.dtypes.dtypes.CategoricalDtype

字符串

rsl1atfo

rsl1atfo1#

您可以使用pd.CategoricalDtype将序列的数据类型更改为类别。
例如,你有这样的字符串dtype系列:

s = pd.Series(['a', 'a', 'b', 'b'])

字符串

s.dtype返回:

dtype('O')


现在,您可以使用以下命令创建分类dtype:

s_dtype = pd.api.types.CategoricalDtype(['b','a'], ordered=True)


然后,您可以使用pd.Series.astype以B < a的排序更改该数据。

s.astype(s_dtype).sort_values()


输出量:

2    b
3    b
0    a
1    a
dtype: category
Categories (2, object): ['b' < 'a']


在那里,

s = pd.Categorical(['a','b'],ordered=True)


是一个分类数组构造函数。

o3imoua4

o3imoua42#

为了补充@Scott的答案,当你想在不同的对象之间维护一个公共的Categorical时,CategoricalDtype非常有用。
让我们考虑例如:

s1 = pd.Series(['a', 'a', 'b', 'b'])
s2 = pd.Series(['a', 'c', 'b', 'b'])

字符串
如果我们转换为泛型Categorical和concat,那么生成的Series福尔斯会返回到object,因为类别并不常见:

out1 = pd.concat([s1.astype('category'),
                  s2.astype('category')])

0    a
1    a
2    b
3    b
0    a
1    c
2    b
3    b
dtype: object


现在使用一个通用的CategoricalDtype确保在组合系列后保持此dtype:

cat = pd.CategoricalDtype(['a', 'b', 'c'])
out2 = pd.concat([s1.astype(cat),
                  s2.astype(cat)])

0    a
1    a
2    b
3    b
0    a
1    c
2    b
3    b
dtype: category
Categories (3, object): ['a', 'b', 'c']


其他示例:

cat = pd.CategoricalDtype(['a', 'b', 'c'], ordered=True)
out = s1.astype(cat) < s2.astype(cat)

0    False
1     True
2    False
3    False
dtype: bool

相关问题