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

如何仅对DataFrame中的连续变量做归一化并忽略分类变量?

问题说明

对DataFrame执行MinMaxScaler归一化时触发以下报错:

ValueError: could not convert string to float: 'M'

报错根因是传入缩放器的数据集包含字符串类型的分类列,缩放器无法将字符串转为浮点型数值计算,且不会自动识别区分连续变量和分类变量。原有实现代码如下:

X=data
mms=MinMaxScaler()
mms.fit(X)
Xnorm=mms.transform(X)
print(Xnorm.min(axis=0))
print(Xnorm.max(axis=0))
print(Xnorm.shape)
实现方法

核心思路是先识别数据集中的连续数值列,仅对这部分列执行归一化操作,分类列保留原值即可,有两种常用实现方案:

  • 方案1:手动筛选数值列处理后拼接
    先通过pandas内置的类型筛选方法取出所有数值列,单独做归一化后再和原数据的分类列合并,代码逻辑简单易读:
    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    
    X = data
    # 筛选所有数值类型的连续变量列名
    numeric_cols = X.select_dtypes(include='number').columns.tolist()
    
    mms = MinMaxScaler()
    # 仅对数值列做归一化拟合与转换
    scaled_numeric = mms.fit_transform(X[numeric_cols])
    
    # 拷贝原数据,将归一化后的数值替换回对应列,保留分类列原值
    Xnorm = X.copy()
    Xnorm[numeric_cols] = scaled_numeric
    
    # 校验归一化结果
    print(Xnorm[numeric_cols].min(axis=0))
    print(Xnorm[numeric_cols].max(axis=0))
    print(Xnorm.shape)
    
  • 方案2:用sklearn的ColumnTransformer指定列处理规则
    适合后续要接入sklearn建模流水线的场景,可以直接在转换器中定义不同列的处理逻辑,非数值列设置为直接透传:
    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import MinMaxScaler
    
    X = data
    numeric_cols = X.select_dtypes(include='number').columns.tolist()
    
    # 定义列转换规则:数值列做MinMax归一化,其余列原样保留
    col_transformer = ColumnTransformer(
        transformers=[
            ('minmax_scaler', MinMaxScaler(), numeric_cols)
        ],
        remainder='passthrough'
    )
    
    Xnorm = col_transformer.fit_transform(X)
    

提示:如果处理后的数据要用于模型训练,分类列不能直接保留字符串格式,需要额外根据场景做标签编码、独热编码等数值化转换。

内容的提问来源于stack exchange,提问作者P.Brito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:48:34