Pandas中factorize与Categorical将数值转为因子的区别是什么
Pandas中factorize与Categorical转换因子类型的核心区别
1. 核心返回结果不同
pd.factorize()本质是编码工具,返回两个值:第一个是整数编码数组,第二个是去重后的类别值数组,不会直接生成Categorical类型的对象,示例:
import pandas as pd ser = pd.Series([1,2,2,3,1]) codes, categories = pd.factorize(ser) # codes输出: array([0, 1, 1, 2, 0], dtype=int64) # categories输出: Index([1, 2, 3], dtype='int64')
pd.Categorical()是直接生成Categorical类型的因子对象,自带codes和categories两个属性,不需要额外拼接就能直接作为因子类型使用,示例:
cat = pd.Categorical(ser) # 输出: [1, 2, 2, 3, 1] # Categories (3, int64): [1, 2, 3] # 可直接调用cat.codes、cat.categories获取对应值
如果需要把factorize的结果转成Categorical类型,可以用
pd.Categorical.from_codes(codes, categories)方法实现二者的转换。
2. 类别顺序处理逻辑不同
factorize默认按值第一次出现的顺序分配编码,没有内置的有序类别支持,仅可通过传入sort=True参数让类别按升序排序后分配编码,最终仅返回编码和类别列表,没有有序标记。Categorical支持显式指定ordered=True声明有序因子,还可以手动传入categories参数自定义类别顺序,不需要依赖原始数据的出现顺序或者排序规则,示例:
# 自定义类别顺序为3>2>1的有序因子 ordered_cat = pd.Categorical(ser, categories=[3,2,1], ordered=True)
3. 适用场景不同
- 如果只需要把离散值转成整数编码用于模型训练、分组计数等场景,用
factorize更轻量,直接拿到编码数组就能用。 - 如果需要保留类别本身的语义、做有序类别比较、后续要用到Pandas针对Categorical类型的优化操作(比如切片、分组、排序按自定义顺序执行),就直接用
Categorical生成因子类型。
4. 缺失值处理差异
factorize会把缺失值NaN的编码默认设为-1,不会把NaN算入类别列表里。Categorical默认不会把NaN作为类别,除非你显式把NaN加到categories参数里,缺失值位置的codes会显示为-1,输出时显示为NaN。
内容的提问来源于stack exchange,提问作者MClaver89
相关产品推荐
相关产品推荐

