使用pandas.get_dummies时如何去除冗余分类编码列?
解决pandas.get_dummies生成的冗余分类列问题
这确实是one-hot编码里很常见的问题——对于有n个类别的分类变量,我们只需要n-1列就能完整表达所有类别信息,剩下的一列完全可以通过其他列反向推导出来。冗余列不仅会增加数据维度,还可能在后续建模(比如线性回归)中引发多重共线性问题。下面给你两种实用的解决方法:
方法一:直接用get_dummies的drop_first参数(推荐)
这是最简洁高效的方式,在生成one-hot编码时就自动去掉每个分类变量的第一个类别对应的列:
import pandas as pd # 初始化你的DataFrame df = pd.DataFrame(data=[['male','blue'],['female','brown'], ['male','black']],columns=['gender','eyes']) # 使用drop_first=True去除冗余列 df_dummies = pd.get_dummies(df, drop_first=True)
运行后得到的df_dummies结果如下:
| gender_male | eyes_blue | eyes_brown | |
|---|---|---|---|
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 2 | 1 | 0 | 0 |
这里gender_male列的值就足够表达性别信息:1代表male,0代表female;而eyes_blue和eyes_brown同时为0时,就对应black眼睛,完全没有信息损失。
方法二:手动删除已生成的冗余列
如果已经生成了包含冗余列的df_dummies,可以手动删除每个分类变量下的任意一列(保留n-1列即可):
# 假设已经生成了原始的df_dummies df_dummies = pd.get_dummies(df) # 手动删除冗余列:比如去掉gender_female和eyes_black df_dummies_cleaned = df_dummies.drop(['gender_female', 'eyes_black'], axis=1)
这种方法适合需要自定义保留哪一列的场景,但变量较多时不如第一种方法高效。
简单总结一下:优先用drop_first=True参数自动处理,既省事儿又能避免手动操作出错~
内容的提问来源于stack exchange,提问作者gabboshow
相关产品推荐
相关产品推荐

