如何统一Pandas DataFrame中两个分类列的编码(含150个类别)
解决Pandas两分类列统一编码的问题
嘿,这个统一分类编码的问题我太熟了!你现在的核心问题是两个列的编码规则没拉通,导致不同类别撞了编码。给你两个靠谱的解决方案,都是我平时处理这类问题常用的:
方法一:手动构建全局编码映射(最灵活)
这种方法完全由你掌控编码规则,适合需要自定义特定类别编码的场景:
- 先收集所有唯一类别:把两列的类别合并,确保没有遗漏任何一个类别
- 自定义核心编码规则:先把你需要固定的类别(比如b→1,c→2)写进映射字典
- 自动分配剩余编码:给剩下的类别分配不重复的编码,避免冲突
- 应用映射到两列:用
map()方法把原列转换成统一编码
示例代码:
import pandas as pd # 构造类似你的DataFrame示例 df = pd.DataFrame({ 'A': ['b', 'a', 'd', 'b', 'f'], 'B': ['c', 'b', 'e', 'c', 'a'] }) # 步骤1:收集所有唯一类别 all_categories = pd.concat([df['A'], df['B']]).unique() # 步骤2:初始化自定义编码映射 code_mapping = { 'b': 1, 'c': 2 # 这里固定你要的c→2 } # 步骤3:给剩余类别分配不重复编码(从3开始) next_code = 3 for cat in all_categories: if cat not in code_mapping: code_mapping[cat] = next_code next_code += 1 # 步骤4:对两列应用编码 df['A_encoded'] = df['A'].map(code_mapping) df['B_encoded'] = df['B'].map(code_mapping) print(df)
运行后你会看到,不管是列A还是列B里的b都对应1,c都对应2,其他类别也有唯一的编码,不会冲突。
方法二:用Pandas Categorical类型统一管理
如果你的编码规则是“固定几个类别,剩下的按顺序来”,用Categorical类型更简洁:
示例代码:
import pandas as pd df = pd.DataFrame({ 'A': ['b', 'a', 'd', 'b', 'f'], 'B': ['c', 'b', 'e', 'c', 'a'] }) # 收集所有类别,然后调整顺序:把需要固定编码的放在前面 all_cats = pd.concat([df['A'], df['B']]).unique() # 先放b和c,再放其他类别 ordered_cats = ['b', 'c'] + [cat for cat in all_cats if cat not in ['b', 'c']] # 转换为Categorical并生成编码(默认从0开始,所以+1让b对应1) df['A_encoded'] = pd.Categorical(df['A'], categories=ordered_cats).codes + 1 df['B_encoded'] = pd.Categorical(df['B'], categories=ordered_cats).codes + 1 print(df)
这种方法的好处是,后续如果要新增类别,只需要更新ordered_cats列表就行,编码会自动顺延。
注意事项:
- 不管用哪种方法,都要确保所有类别都被包含在编码映射里,不然转换后会出现
NaN - 如果后续有新类别加入DataFrame,记得先更新你的编码映射,再重新转换
- 手动指定编码时,一定要检查有没有重复的编码值,避免再次出现类别撞码的问题
内容的提问来源于stack exchange,提问作者mar
相关产品推荐
相关产品推荐

