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

如何将Pandas DataFrame向量列转换为Scikit-learn可用特征

解决Pandas列表列适配Scikit-learn模型的高效方法

问题场景

现有如下Pandas DataFrame,其中vector列存储浮点型列表,target为布尔型标签:

import pandas as pd
import numpy as np

vectors = pd.Series([[1.0, 2.0, 3.0], [0.5, 1.5, 2.5], [0.1, 1.1, 2.1]], name='vector')
output = pd.Series([True, False, True], name='target')
data = pd.concat((vectors, output), axis=1)

尝试用Scikit-learn的LogisticRegression直接以data['vector']作为输入训练时,会抛出错误:

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X=data['vector'], y=data['target'])

报错信息:

ValueError: setting an array element with a sequence

即使使用data['vector'].apply(np.array)转换,依然会触发相同错误,仅通过np.array(data['vector'].to_list())可正常训练,但该方法在大数据集下转换成本较高,需要更高效的方案。

问题根源

Scikit-learn模型要求输入特征矩阵X是二维数值数组(形状为(n_samples, n_features)),而Pandas Series存储列表/数组时,本质是一维容器——每个元素是数组,但Series整体维度为1,模型无法识别为符合要求的特征矩阵,因此报错。

高效解决方案

1. 直接用Pandas展开列表列(最简洁高效)

利用pd.DataFrame的tolist()方法直接将列表列展开为多特征列,Pandas内部实现经过优化,转换效率远高于手动处理numpy数组:

X = pd.DataFrame(data['vector'].tolist())
# 之后可直接训练
clf = LogisticRegression()
clf.fit(X, data['target'])

2. 整合进Scikit-learn流水线(适合复杂预处理场景)

如果需要和其他预处理步骤结合,可使用ColumnTransformer配合FunctionTransformer构建流水线,保持流程一致性:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import FunctionTransformer
from sklearn.pipeline import Pipeline

# 定义列表列展开函数
def expand_list_column(col):
    return np.array(col.tolist())

# 构建预处理转换器
preprocessor = ColumnTransformer(
    transformers=[
        ('expand_vector', FunctionTransformer(expand_list_column), ['vector'])
    ],
    remainder='drop'
)

# 构建完整流水线
pipeline = Pipeline(steps=[
    ('preprocess', preprocessor),
    ('classifier', LogisticRegression())
])

# 直接用原始DataFrame训练
pipeline.fit(data, data['target'])

3. 从数据源避免列表列(最优方案)

如果数据集是自己生成的,直接将向量存储为多列DataFrame而非列表列,彻底消除后续转换开销:

# 直接生成多特征列,而非列表列
vectors = pd.DataFrame(
    [[1.0, 2.0, 3.0], [0.5, 1.5, 2.5], [0.1, 1.1, 2.1]],
    columns=['feat_1', 'feat_2', 'feat_3']
)
data = pd.concat([vectors, output], axis=1)

# 直接训练无需转换
clf = LogisticRegression()
clf.fit(vectors, data['target'])

内容的提问来源于stack exchange,提问作者Katya Willard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:33:33