独热编码合并DataFrame后列名含括号逗号的问题及解决
问题解答
原因分析
这既不是sklearn OneHotEncoder的问题,也不是Pandas的问题,是对OneHotEncoder返回的类别格式处理不当导致的:
- sklearn的OneHotEncoder的
categories_属性返回的是嵌套数组(每个输入特征对应一个类别数组),比如单特征场景下,categories_是array([['a', 'b', 'c']], dtype=object)。 - 直接把这个嵌套数组传给Pandas DataFrame的
columns参数时,Pandas会将每个子数组转换成字符串表示,也就是(a,)、(b,)这类格式。
另外你提供的示例代码存在几处笔误:原DataFrame的列是col,但代码里写了col3;enc = ohe()需要先导入OneHotEncoder,正确写法是from sklearn.preprocessing import OneHotEncoder后初始化enc = OneHotEncoder()。
解决方法
方法1:正确提取categories_中的类别
既然categories_是嵌套数组,单特征场景下直接取第一个元素即可:
from sklearn.preprocessing import OneHotEncoder import pandas as pd # 生成示例DataFrame d = {'col': ['a','b','c']} df = pd.DataFrame(data=d) # 创建编码器并转换(设置sparse_output=False直接返回数组,无需toarray()) enc = OneHotEncoder(sparse_output=False) temp = enc.fit_transform(df[['col']]) # 正确提取类别(取嵌套数组的第一个元素) labels = enc.categories_[0] # 创建特征DataFrame features = pd.DataFrame(temp, columns=labels) # 合并并清理原列 df_enc = pd.concat([df, features], axis=1).drop('col', axis=1) print(df_enc.head())
输出的列名就是a、b、c,无多余符号。
方法2:使用get_feature_names_out()(推荐)
OneHotEncoder自带get_feature_names_out()方法,可直接生成规范列名,支持添加前缀,多特征场景也能自动区分特征来源:
from sklearn.preprocessing import OneHotEncoder import pandas as pd d = {'col': ['a','b','c']} df = pd.DataFrame(data=d) enc = OneHotEncoder(sparse_output=False) temp = enc.fit_transform(df[['col']]) # 生成带前缀的规范列名,比如前缀为'col',列名就是col_a、col_b、col_c features = pd.DataFrame(temp, columns=enc.get_feature_names_out(['col'])) df_enc = pd.concat([df, features], axis=1).drop('col', axis=1) print(df_enc.head())
输出列名清晰直观,便于后续识别特征归属。
方法3:事后重命名列名
如果已经生成了带括号逗号的列名,可直接通过字符串替换清理:
# 假设df_enc是已生成的带问题列名的DataFrame df_enc.columns = [col.strip('()').rstrip(',') for col in df_enc.columns]
执行后(a,)会被转换成a,快速解决列名格式问题。
内容的提问来源于stack exchange,提问作者Wee Liang Kelven Lim
相关产品推荐
相关产品推荐

