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

如何将Pandas Series中OneHotEncoder输出的np.array转为数值类型?

问题原因

你当前将OneHotEncoder输出的形状为(样本数, 姓氏类别数)的numpy数组逐行转为列表后,塞进了pandas的单个列中,pandas会将存储列表/数组的列默认识别为object类型,这类非扁平的数值结构无法直接传入常规机器学习模型。

解决方案

常用方案:将独热编码展开为独立特征列

这是绝大多数建模场景的标准处理方式,每个独热编码维度对应一个独立的特征列,全部为数值类型,可直接传入模型训练:

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformer

# 原有编码逻辑,sklearn 1.2+版本用sparse_output=False,旧版本换回sparse=False
transformer = make_column_transformer((OneHotEncoder(sparse_output=False), ['Surname']), remainder = "drop")
encoded_surname = transformer.fit_transform(titanic)
# 生成独热编码对应的列名
encoded_cols = transformer.get_feature_names_out()
# 编码结果转为DataFrame
encoded_df = pd.DataFrame(encoded_surname, columns=encoded_cols, index=titanic.index)
# 拼接回原数据集,可按需删除不需要的原始列
titanic = pd.concat([titanic.drop(['Surname', 'Encoded_Surname'], axis=1, errors='ignore'), encoded_df], axis=1)

特殊场景:保留单列存储的处理方式

如果确实需要将整个编码向量存在单个列中,训练时可直接将该列转为符合模型要求的数值矩阵:

# 提取训练特征
X = np.concatenate([
    titanic[['Pclass', 'Sex', 'SibSp', 'Parch', 'Fare']].values,
    np.stack(titanic['Encoded_Surname'].values)
], axis=1)
y = titanic['Survived'].values

得到的X为全数值类型的二维矩阵,可直接传入分类模型训练。

内容的提问来源于stack exchange,提问作者cagatay.e.sahin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:06