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

如何在Scikit-learn Pipeline中仅标准化Pandas DataFrame指定列?

在scikit-learn Pipeline中仅标准化指定列的解决方案

这个问题在scikit-learn里很常见——它的Pipeline默认会对整个输入矩阵做统一处理,不像SparkML那样能直接指定目标列。不过我们可以用ColumnTransformer工具来实现精准的列选择,完美适配你的需求!

完整代码示例

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

# 模拟你的DataFrame结构
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': ['x', 'y', 'x', 'y', 'x']
})

# 定义列预处理规则:仅对A、B列做标准化,C列原样保留
preprocessor = ColumnTransformer(
    transformers=[
        # 格式:(步骤名称, 转换器, 目标列列表)
        ('standard_scaler', StandardScaler(), ['A', 'B'])
    ],
    # 关键参数:未被指定处理的列直接传递,不丢弃
    remainder='passthrough'
)

# 把预处理逻辑整合进Pipeline(后续可添加其他步骤如模型)
pipeline = Pipeline([
    ('preprocess', preprocessor)
])

# 执行处理并转回DataFrame(因为fit_transform返回numpy数组,需要恢复列名)
df_scaled = pipeline.fit_transform(df)
df_scaled = pd.DataFrame(df_scaled, columns=['A', 'B', 'C'])

print(df_scaled)

核心逻辑解释

  1. ColumnTransformer的作用:它是scikit-learn专门用来给不同列分配不同预处理规则的工具,完美解决了"部分列处理、部分列保留"的需求。
  2. remainder='passthrough'的必要性:如果不设置这个参数,默认会丢弃所有未被指定处理的列(也就是你的字符串列C会丢失),设置后这些列会原封不动地保留在结果中。
  3. 恢复DataFrame结构:fit_transform返回的是无列名的numpy数组,所以最后需要手动指定列名,还原成你熟悉的DataFrame格式。

扩展:后续添加模型步骤

如果你的Pipeline后续还要接入模型(比如分类、回归),可以直接在Pipeline里追加步骤,和SparkML的使用逻辑完全一致:

from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ('preprocess', preprocessor),
    ('classifier', LogisticRegression())
])

内容的提问来源于stack exchange,提问作者Romeo Kienzler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:20:01