使用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
相关产品推荐
相关产品推荐

