使用KNN Imputer填充NaN值后仍存在缺失值的问题排查
问题排查与解决
核心错误点
DataFrame列名不匹配
imputed_data是fit_transform返回的numpy数组,创建df_temp时没指定列名,导致df_temp用默认的0、1、2...作为列名,和df_int的原列名完全不对应。执行df_int["Wave Height"] = df_temp["Wave Height"]时,df_temp里根本没有叫Wave Height的列,赋值后自然变成NaN,这就是那6个缺失值的来源。未处理Water Temperature列
你只替换了Wave Height和Wave Period,Water Temperature的原始63个缺失值没被填充后的列覆盖,所以缺失值还在。
修正后的代码
from sklearn.impute import KNNImputer import pandas as pd imputer = KNNImputer(n_neighbors=30) df_int = df.drop(columns=["Beach Name", "Transducer Depth", "Measurement Timestamp 24h"]) imputed_data = imputer.fit_transform(df_int) # 创建填充后的DataFrame时必须指定列名,和df_int保持一致 df_temp = pd.DataFrame(imputed_data, columns=df_int.columns) # 直接用填充后的df_temp覆盖原df_int,避免逐个列赋值出错 df_int = df_temp.copy() # 检查缺失值情况 print(df_int.isna().sum())
补充说明
KNN填充本身是生效的(df_temp无缺失值),问题完全出在填充后的数据回传环节——列名不匹配导致赋值失败,加上没覆盖所有有缺失的列。直接用df_temp覆盖df_int是最稳妥的方式,不用手动逐个列替换。
内容的提问来源于stack exchange,提问作者mrgoat
相关产品推荐
相关产品推荐

