使用Pandas get_dummies维度异常:如何保持特征原维度?
解决方法
你遇到的问题根源是pd.get_dummies生成的编码列变成了二维形状,这多半是因为原始分类列里的元素不是单一标量值(比如存了列表、元组这类可迭代对象),导致编码后每个单元格是数组而非单个0/1值。要实现独热编码且保持特征为一维(形状(60,)),按下面的步骤操作:
1. 先清洗原始分类列,确保每个单元格是单一值
如果原始列里有多值元素(比如Gender列出现["Female", "Male"]这类内容),得先把它处理成单个值,根据实际需求调整:
- 若列内容是逗号分隔的字符串,拆分后取指定值:
# 示例:拆分后取第一个值,可根据需求修改索引 df["Gender"] = df["Gender"].str.split(",").str[0]
- 若列元素是列表类型,直接提取单个元素:
df["Gender"] = df["Gender"].apply(lambda x: x[0] if isinstance(x, list) else x)
2. 重新执行独热编码
清洗完成后再运行pd.get_dummies,生成的编码列就会是一维的0/1数组(形状(60,)):
ohe_features = ["Gender", "Married", "Self_Employed"] num_features = ["Dependents"] df = pd.get_dummies(df, columns=ohe_features, dtype=int)
此时检查列的形状,就能看到每个编码列都是(60,),符合要求。
3. 备选方案:使用sklearn的OneHotEncoder
要是你习惯用scikit-learn工具链,也可以用OneHotEncoder实现,同样要确保原始特征是一维的:
from sklearn.preprocessing import OneHotEncoder import pandas as pd ohe = OneHotEncoder(sparse_output=False, dtype=int) encoded_features = ohe.fit_transform(df[ohe_features]) # 将编码结果转为DataFrame并合并到原数据 encoded_df = pd.DataFrame(encoded_features, columns=ohe.get_feature_names_out(ohe_features)) df = pd.concat([df[num_features], encoded_df], axis=1)
这种方式生成的编码列同样是一维的。
可复现示例验证:
假设原始数据为(修正格式后):
Dependents,Gender,Married,Self_Employed 0,Female,Yes,No
完成清洗(若需要)和pd.get_dummies后,生成的Gender_Female列形状为(1,),符合一维要求。
内容的提问来源于stack exchange,提问作者user19251203
相关产品推荐
相关产品推荐

