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

如何用Pipeline分类数据类型并填充NaN?代码无报错但未生效

问题分析与解决

核心问题点

  • 缺失值格式错误:你的DataFrame里的"NaN"是字符串类型,不是sklearn可识别的真正缺失值(np.nan/pd.NA),导致SimpleImputer无法识别并处理这些“假缺失值”。
  • 未触发管道转换:代码仅定义了预处理管道的结构,但没有将目标DataFrame传入管道执行fit_transform操作,自然看不到处理效果。
  • 分类型缺失值处理不符合需求:你要求分类型NaN直接忽略(不填充),但代码里用了most_frequent(众数填充),和需求相悖。

修正后完整代码

import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# 1. 修正原始DataFrame:将字符串"NaN"转为真实缺失值
d = {'hrs': [1, "NaN", 2], 'Department': ["ResearchDevelopment", "NaN", "ResearchDevelopment"]}
df = pd.DataFrame(data=d)
df = df.replace("NaN", np.nan)

# 数值型特征处理管道:中位数填充 + 标准化
numeric_features = ["hrs"]
numeric_transformer = Pipeline(
    steps=[
        ("imputer", SimpleImputer(strategy="median")),
        ("scaler", StandardScaler())
    ]
)

# 分类型特征处理管道:直接独热编码(保留NaN作为独立类别,即不填充)
categorical_features = ["Department"]
categorical_transformer = Pipeline(
    steps=[
        ("onehot", OneHotEncoder(handle_unknown="ignore", sparse_output=False))
    ]
)

# 组合预处理管道
preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, numeric_features),
        ("cat", categorical_transformer, categorical_features),
    ]
)

# 执行转换,获取处理后的数据
processed_data = preprocessor.fit_transform(df)
print(processed_data)

关键修正说明

  1. 修复缺失值格式:通过df.replace("NaN", np.nan)将字符串形式的缺失值转为sklearn可识别的np.nan,确保SimpleImputer能正常工作。
  2. 触发管道执行:调用preprocessor.fit_transform(df),把DataFrame传入管道,完成所有预处理步骤并输出结果。
  3. 调整分类型处理逻辑:移除分类型特征的SimpleImputer,直接用OneHotEncoder处理——该编码器会自动将np.nan视为一个独立类别,符合“忽略NaN(不填充)”的需求。如果你的“忽略”是指删除含NaN的样本,可在预处理前添加df = df.dropna(subset=categorical_features)。

输出示例

处理后的特征矩阵如下:

[[-1.22474487  1.          0.        ]
 [ 0.          0.          1.        ]
 [ 1.22474487  1.          0.        ]]

内容的提问来源于stack exchange,提问作者Jake Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17