如何在Pandas Categorical中指定自定义编码规则?
Pandas分类编码的顺序控制方法
你提到的cat.codes编码顺序是完全可控且可预测的,默认规则和自定义实现方法如下:
默认编码逻辑
当你用df = pd.read_csv("_.csv", dtype="categorical")读入数据时,Pandas会自动生成分类列的类别列表:
- 字符串类别的默认顺序是字典序排序;
- 数值类别的默认顺序是数值大小排序;
cat.codes的编码严格对应这个列表的索引:第一个类别映射为0,第二个映射为1,以此类推。
比如数据里先出现val2再出现val1,默认读入后categories会是["val1", "val2"],val1对应0,val2对应1。
自定义编码规则的实现方式
如果要指定{"val1": 0, "val2": 1}这类映射规则,有两种常用方案:
方案1:读入后重新定义分类
先按普通方式读入数据,再将目标列转为指定类别顺序的Categorical类型:
import pandas as pd df = pd.read_csv("_.csv") # 指定categories顺序,第一个元素对应0,第二个对应1 df["目标列名"] = pd.Categorical(df["目标列名"], categories=["val1", "val2"], ordered=False) # 查看编码结果 print(df["目标列名"].cat.codes)
方案2:读入时直接指定分类规则
利用pd.CategoricalDtype在读取阶段就定义好类别顺序,避免后续转换操作:
import pandas as pd # 自定义分类类型,指定categories顺序 cat_dtype = pd.CategoricalDtype(categories=["val1", "val2"], ordered=False) # 读取时为目标列指定该类型 df = pd.read_csv("_.csv", dtype={"目标列名": cat_dtype}) # 查看编码结果 print(df["目标列名"].cat.codes)
额外方案:直接映射为数值(非Categorical类型)
如果不需要保留Categorical类型,只是想得到指定的数值编码,可以直接用map方法:
df["目标列名"] = df["目标列名"].map({"val1": 0, "val2": 1})
这种方式会直接生成整数列,跳过Categorical的中间步骤。
内容的提问来源于stack exchange,提问作者Eike P.
相关产品推荐
相关产品推荐

