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

KNN Imputation填充DataFrame分类列缺失值失败求助

KNN填充性别缺失值失败问题解决

问题根源

  1. pd.factorize() 会将Gender列的NaN转为-1,但KNNImputer仅把NaN视为缺失值,不会处理-1,导致这些行的编码值未被填充。
  2. 仅用性别编码列作为KNN输入特征,缺失值样本没有有效特征支撑,无法找到相似邻居完成填充。
  3. 最终映射性别时,-1索引对应pd.unique(df['Gender'])中的NaN,直接导致结果出现缺失值。

修正方案

步骤说明

  1. 正确编码性别并保留NaN:用字典映射将性别转成数值,保留原缺失值,让KNNImputer能识别需要填充的位置。
  2. 结合辅助特征填充:加入Age作为特征,KNN可基于年龄相似度找到邻居,填充逻辑更合理。
  3. 映射回原性别类别:将填充后的数值通过反向字典转回性别文本。

修正后代码

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer

data = {'ID': [1, 2, 3, 4, 5],
        'Age': [20, 25, 30, 35, 40],
        'Gender': ['M', 'F', np.nan, 'F', np.nan]}
df = pd.DataFrame(data)

# 1. 性别编码,保留原NaN
gender_map = {'M': 0, 'F': 1}
df['Gender_num'] = df['Gender'].map(gender_map)

# 2. 用KNN结合Age和Gender_num特征填充
imputer = KNNImputer(n_neighbors=2)
# 传入Age和Gender_num作为KNN计算的特征
df[['Age', 'Gender_imputed_num']] = imputer.fit_transform(df[['Age', 'Gender_num']])

# 3. 将填充后的数值映射回性别文本
reverse_gender_map = {v: k for k, v in gender_map.items()}
# 先取整再映射,确保对应正确的性别编码
df['Gender_imputed'] = df['Gender_imputed_num'].round().astype(int).map(reverse_gender_map)

# 整理输出列
df = df[['ID', 'Age', 'Gender', 'Gender_imputed']]
print(df)

输出结果

ID  Age Gender Gender_imputed
0   1   20      M              M
1   2   25      F              F
2   3   30    NaN              F
3   4   35      F              F
4   5   40    NaN              F

关键说明

  • 加入Age后,KNN会基于年龄相近的样本填充:比如ID3的年龄30,邻居是ID2(25)和ID4(35),均为F,因此填充F;ID5的年龄40,邻居是ID3(30)和ID4(35),也为F,填充F。
  • round()用于处理KNN返回的邻居平均值(如邻居性别编码为0和1时,平均值0.5取整为1),确保能正确映射到性别类别。

内容的提问来源于stack exchange,提问作者Shax Studio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:43:28