使用OneHotEncoder编码分类列时报Input contains NaN的解决方案是什么?
问题根因
两个环境运行结果不一致的核心原因分为两类:
- scikit-learn版本差异:Colab默认预装的scikit-learn版本≥1.1.0,该版本新增了
allow_nan参数支持分类列的缺失值自动编码,即使不显式配置也不会触发Input contains NaN报错;而本地Jupyter环境的scikit-learn版本通常低于1.0.0,未适配缺失值处理逻辑,handle_unknown='ignore'参数仅用于处理训练集未出现的分类值,不会处理NaN,因此触发报错。 - 数据集读取差异:相同数据源在两个环境的读取规则不同,例如本地读取csv时会将空值、空字符串统一识别为NaN,而Colab部分读取逻辑会将空字符串识别为独立分类值,导致Jupyter环境下的
inputs_df[categorical_cols]实际存在缺失值,Colab对应数据集无缺失值。
解决方案
方案1:对齐scikit-learn版本
升级本地Jupyter环境的scikit-learn包至最新版本,显式配置allow_nan参数:
- 执行升级命令:
pip install --upgrade scikit-learn - 修改编码器初始化代码:
encoder = OneHotEncoder(sparse=False, handle_unknown='ignore', allow_nan=True).fit(inputs_df[categorical_cols]) encoded_cols = list(encoder.get_feature_names(categorical_cols)) inputs_df[encoded_cols] = encoder.transform(inputs_df[categorical_cols])
方案2:提前填充缺失值
无需升级依赖,提前将分类列的NaN替换为独立占位符,避免触发报错:
# 填充所有分类列的缺失值 inputs_df[categorical_cols] = inputs_df[categorical_cols].fillna('Missing') # 原有逻辑保持不变 encoder = OneHotEncoder(sparse=False,handle_unknown='ignore').fit(inputs_df[categorical_cols]) encoded_cols = list(encoder.get_feature_names(categorical_cols)) inputs_df[encoded_cols] = encoder.transform(inputs_df[categorical_cols])
方案3:校验数据集一致性
运行以下代码确认两个环境的数据集缺失值情况是否一致:
print(inputs_df[categorical_cols].isna().sum())
如果Jupyter环境输出的缺失值统计大于0,优先执行缺失值填充即可解决问题。
内容的提问来源于stack exchange,提问作者Samuel David Egwu
相关产品推荐
相关产品推荐

