如何在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)
核心逻辑解释
ColumnTransformer的作用:它是scikit-learn专门用来给不同列分配不同预处理规则的工具,完美解决了"部分列处理、部分列保留"的需求。remainder='passthrough'的必要性:如果不设置这个参数,默认会丢弃所有未被指定处理的列(也就是你的字符串列C会丢失),设置后这些列会原封不动地保留在结果中。- 恢复DataFrame结构:
fit_transform返回的是无列名的numpy数组,所以最后需要手动指定列名,还原成你熟悉的DataFrame格式。
扩展:后续添加模型步骤
如果你的Pipeline后续还要接入模型(比如分类、回归),可以直接在Pipeline里追加步骤,和SparkML的使用逻辑完全一致:
from sklearn.linear_model import LogisticRegression pipeline = Pipeline([ ('preprocess', preprocessor), ('classifier', LogisticRegression()) ])
内容的提问来源于stack exchange,提问作者Romeo Kienzler
相关产品推荐
相关产品推荐

