dataframe如何改变dtype为Categorical?自定义排序筛选
发布于 作者:苏南大叔 来源:程序如此灵动~

涉及到一个新的dtype
类型:Categorical
。如何理解这个Categorical
数据类型呢?什么时候使用这个Categorical
数据类型呢?如何使用.astype()
来改变dataframe
的dtype
呢?这些都是本文要考虑的问题。

苏南大叔的“程序如此灵动”博客,记录苏南大叔看到的想到的编程故事。本文测试环境:win10
,python@3.12.0
,scikit-learn@1.3.2
,pandas@2.1.3
。本文中的pandas
版本很重要,因为网络上流行的解决方案都是基于pandas
的早期版本的,现在都失效了。
前文回顾
第一段内容还是先回顾一下以前写过的相关文章。如果需要,可以先看看基础知识点。
- 《如何定义一个
dataframe
?》 https://newsn.net/say/pandas-dataframe.html
pandas
的dataframe
和numpy
的二维ndarray
很相似,dataframe
可以理解为一个增强版的二维ndarray
。下面的文章是基于ndarray
来理解dtype
的,而不是dataframe
。仅供参考:
- 《如何理解ndarray的dtype?》 https://newsn.net/say/ndarray-dtype.html
- 《利用 np.astype()改变ndarray的dtype?》https://newsn.net/say/numpy-astype.html
龙套演员
依然有请苏南大叔的会后空翻的宠物列表,它们上过专门的宠物学校,作为dataframe
的龙套演员:
输出:
所以,关于dtype
,初步的结论是:
- 定义在
dataframe
上叫.dtypes
,定义在某一列上叫.dtype
。【注意拼写差一个字母s
】。 - 字符串类型的
dtype
被归为object
。
Categorical有序分类数据类型
苏南大叔理解着Categorical
看起来和枚举类型非常类似,但是,两者是不同的。
Categorical
英文单词解释是:"明确的;绝对的"。
定义一个Categorical
代码如下:
输出:
值得注意的是:
- 这个类型的变量
print
的结果,恒定是category
,是不是不明觉厉?处理的略草率。 ordered
这个参数,暂时不做探讨,恒定为true
即可。

设置dtype
输出:
注意,这里.astype()
后,有个再次赋值给原列数据的操作。对应列的dtype
由object
变成了category
。
自定义排序
表明上定义的是个dtype
,实际上定义的是这列数据的排序标准。.astype()
之后,这列数据获得了自定义排序功能。对应如下:
输出:
很明显,这个新的排序更加合理。
自定义筛选
定义了dtype
为Categorical
之后,还获得非常合理的数据筛选能力。例如:
输出:
可能遇到的问题
如果使用以前的写法的话,旧写法:
可能会遇到下面的报错信息:
参考文章:
Removed the previously deprecated ordered and categories keyword arguments in astype (GH 17742)
影响独热码的.categories_属性
再来一个例子:
结语
更多python
相关经验文字,请点击:


