KNNImputer处理数值型DataFrame时意外丢弃列的原因排查
问题原因及解决办法
核心原因:输入数据中存在全为NaN的列
KNNImputer的插补逻辑依赖列内的有效值计算样本间距离,若某一列所有值都是NaN,既无法参与距离计算,也找不到任何邻居的有效值完成插补,这类列会被直接排除在输出结果之外。你的输入列数216,输出27,说明有216-27=189列是完全缺失的。
验证方法
执行以下代码确认全NaN列的数量及具体列名:
# 统计全NaN列的数量 print(input_df.isna().all().sum()) # 查看具体哪些列是全NaN print(input_df.columns[input_df.isna().all()])
解决思路
- 保留全NaN列:如果这些列有业务价值,KNNImputer无法处理这类完全缺失的列,需要换用其他插补方式(比如按业务规则填充固定值、全局均值/中位数等),之后再结合KNNImputer处理其他列。
- 删除全NaN列:如果这些列无实际意义,可以提前删除后再用KNNImputer插补:
# 删除所有全NaN列 clean_df = input_df.drop(columns=input_df.columns[input_df.isna().all()]) # 再执行插补 output_df = imputer.fit_transform(clean_df)
关于n_neighbors=1的说明
你说得没错,这个参数只会影响插补值的选取逻辑(用最近邻的单一值替换缺失),和列被丢弃的问题完全无关。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

