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

独热编码合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:10:24