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

如何统一Pandas DataFrame中两个分类列的编码(含150个类别)

解决Pandas两分类列统一编码的问题

嘿,这个统一分类编码的问题我太熟了!你现在的核心问题是两个列的编码规则没拉通,导致不同类别撞了编码。给你两个靠谱的解决方案,都是我平时处理这类问题常用的:

方法一:手动构建全局编码映射(最灵活)

这种方法完全由你掌控编码规则,适合需要自定义特定类别编码的场景:

  1. 先收集所有唯一类别:把两列的类别合并,确保没有遗漏任何一个类别
  2. 自定义核心编码规则:先把你需要固定的类别(比如b→1,c→2)写进映射字典
  3. 自动分配剩余编码:给剩下的类别分配不重复的编码,避免冲突
  4. 应用映射到两列:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:48:26