You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cat.codes转换分类特征后,如何查询数值标签对应的原始类别?

分类变量编码后映射关系丢失的解决办法

你用df[col].astype("category").cat.codes直接覆盖原列后,原列会从category dtype变成整数类型,没法再通过.cat访问原始类别映射;后续再转category时,pandas会把当前的整数当成新的类别值,自然查不到原始的"Male"/"Female"这类标签。

下面是两种可行的解决思路:

方法1:保留原列的category类型,单独生成编码列

这种方式既能用编码列做特征选择,又能随时通过原列查询类别与编码的对应关系:

import pandas as pd
data = [[14, "Male", "employed"], [89, "Female", "student"], [48, "Other", "employed"]]
df = pd.DataFrame(data, columns=['Age', 'Gender', 'Occupation'])

categorical_feat = ["Gender", "Occupation"]
# 先将分类列转为category类型,保留原始映射
for col in categorical_feat:
    df[col] = df[col].astype("category")
# 单独生成编码列,不覆盖原列
for col in categorical_feat:
    df[f"{col}_code"] = df[col].cat.codes

# 查询Gender的所有类别及对应编码
print(df["Gender"].cat.categories)  # 输出 Index(['Female', 'Male', 'Other'], dtype='object')
print(df["Gender"].cat.categories[0])  # 输出 'Female',对应编码0
# 反向查询:编码对应的原始类别
code_to_gender = dict(enumerate(df["Gender"].cat.categories))
print(code_to_gender[0])  # 输出 'Female'

方法2:提前保存每个特征的类别-编码映射字典

如果必须覆盖原列为编码值,提前把映射关系存下来就行:

import pandas as pd
data = [[14, "Male", "employed"], [89, "Female", "student"], [48, "Other", "employed"]]
df = pd.DataFrame(data, columns=['Age', 'Gender', 'Occupation'])

categorical_feat = ["Gender", "Occupation"]
# 用字典存储每个特征的编码-类别映射
category_mappings = {}

for col in categorical_feat:
    temp_cat = df[col].astype("category")
    # 保存当前特征的映射关系
    category_mappings[col] = dict(enumerate(temp_cat.cat.categories))
    # 将原列替换为编码值
    df[col] = temp_cat.cat.codes

# 查询Gender的编码映射
print(category_mappings["Gender"])  # 输出 {0: 'Female', 1: 'Male', 2: 'Other'}
print(category_mappings["Gender"][0])  # 输出 'Female'

额外提示

后续做OneHotEncoding时,建议基于原始的category列或者提前保存的映射表,避免不同阶段编码不一致的问题;两种方法都能批量处理大量特征,不用手动逐个编码。

内容的提问来源于stack exchange,提问作者wick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:43:21