能否为独热编码特征添加多级索引?以蘑菇数据集为例
实现独热编码后的多级列索引(原始特征分组显示)
完全可以实现你想要的效果,核心是把pd.get_dummies生成的下划线分隔列名拆分成多级列索引,让原始特征作为一级索引,子类别作为二级索引。以下是适配你现有代码的修改方案:
修改后的完整代码
import pandas as pd # 原始数据处理步骤 mode = df['Stalk Root'].mode() # 最常见值是b df = df.replace('?', 'b') # 替换所有问号为众数 df['Ring Number'] = df['Ring Number'].replace({'n': 0, 'o': 1, 't': 2}).astype(int) df['Gill Spacing'] = df['Gill Spacing'].replace({'c': 0, 'w': 1, 'd': 2}).astype(int) # 1. 执行独热编码 df = pd.get_dummies(df) # 2. 将列名拆分为多级索引:(原始特征名, 子类别) df.columns = pd.MultiIndex.from_tuples( tuple(col.split('_', 1)) if '_' in col else (col, '') for col in df.columns ) # 3. 删除冗余列(注意现在用元组指定多级索引列) df.drop( labels=[ ('Poisonous', 'e'), ('Bruises', 'f'), ('Gill Size', 'n'), ('Stalk Shape', 't'), ('Veil Type', 'p') ], axis=1, inplace=True ) # 4. 重命名指定列的索引(可选,让二分类列的二级索引更简洁) df = df.rename(columns={ ('Poisonous', 'p'): ('Poisonous', ''), ('Bruises', 't'): ('Bruises', '') })
关键步骤解释
拆分列名生成多级索引
用pd.MultiIndex.from_tuples遍历所有列名:- 对带下划线的列(如
Cap Shape_Bell),按第一个下划线拆分为('Cap Shape', 'Bell') - 对手动编码的无下划线列(如
Ring Number),生成('Ring Number', '')来保持多级结构统一
- 对带下划线的列(如
适配多级索引的列操作
删除或重命名列时,必须用元组指定完整的多级索引路径,比如要删Poisonous_e,现在要写成('Poisonous', 'e')优化二分类列显示(可选)
对于你保留的二分类列(如Poisonous_p),可以把二级索引设为空字符串,这样显示时更简洁,同时保持和其他特征的多级结构一致
最终效果
处理后的DataFrame列会按原始特征分组显示,比如:
Cap Shape ... Poisonous Bell Conical Flat ... 0 1 0 0 ... 1 1 0 1 0 ... 0 ...
内容的提问来源于stack exchange,提问作者Georgia Anderson
相关产品推荐
相关产品推荐

