Datawig补全缺失值时Cabin、Name列未被填充的问题求解
问题原因
datawig.SimpleImputer.complete()方法内置了离散列自动过滤逻辑:默认会跳过唯一值数量超过max_unique_values_for_discrete_imputation阈值(默认值为200)的高基数离散列,不对其执行插补。
你的数据集中:
- Name列属于极高基数特征,几乎每个值对应唯一乘客,唯一值总数远高于默认阈值
- Cabin列为多段拼接的舱位信息,唯一值总数也超过了默认200的阈值
因此两列被自动跳过,其余低基数object列(HomePlanet、Destination等)、数值列均正常完成插补,和观测到的缺失值剩余数量完全匹配。
如果调高阈值后仍存在未填充情况,可额外检查两列的缺失值是否为非标准格式:比如空字符串、"NA"/"null"等自定义占位符,这类值不会被识别为缺失值参与插补。
解决方案
- 方案1:全局调参覆盖高基数列
调用complete()方法时手动调高基数阈值,阈值大小设置为大于Cabin、Name列的实际唯一值总数即可,示例代码:
import datawig df = datawig.SimpleImputer.complete( df, max_unique_values_for_discrete_imputation=10000 )
方案2:高基数列定制化插补(推荐,准确率更高)
直接对原始高基数字符串做全局插补的准确率通常很低,建议拆分字段后分别处理:- 对Name列:可先提取乘客组ID、姓氏字段,通过同行乘客信息做规则匹配填充,效果优于通用模型插补
- 对Cabin列:按
/分隔拆分为Deck(舱层)、Cabin_num(舱号)、Side(舷侧)三个低基数子列,对子列分别插补后再拼接为完整Cabin字段,插补准确率更高,也不会触发高基数过滤规则
方案3:预处理非标准缺失值
若调参后仍未填充,先将两列中的非标准缺失占位符替换为标准空值再执行插补:
import numpy as np # 替换常见非标准缺失值 df[["Cabin", "Name"]] = df[["Cabin", "Name"]].replace(["", "NA", "None", "null"], np.nan) # 再执行插补逻辑
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

