一、缺失值的概念
表现形式
1.数据库中常用null表示
2.部分编程语言中用NA表示
3.可能表现为空字符串(‘’)或特定数值
4.在Pandas中统一用NaN表示(来自NumPy库,NaN、NAN、nan本质一致)
NaN的特性
1.与任何值都不相等(包括自身),如NaN == 0、NaN == NaN结果都是False。
2.判断方法:Pandas提供isnull()/isna()(判断是否为缺失值)和notnull/notna()(判断是否为缺失值)
二、缺失值的来源于加载
来源
1.原始数据本身包含缺失值(如用户未填写的问卷信息)
2.数据整理过程中产生(如数据格式转换、合并时出现不匹配)
加载包含缺失值的数据(以Pandas为例)
方法 | 说明 |
---|---|
pd.read_csv('file.csv') | 默认加载,自动识别常见缺失值形式 |
pd.read_csv('file.csv', keep_default_na=False) | 不加载默认缺失值 |
pd.read_csv('file.csv', na_values=[""], keep_default_na=False) | 手动指定缺失值标识(如空字符串) |
三、缺失值的检测与分析
基础检测方法
1.查看特定字段确实情况:如train['Survived'].value_counts()
2.计算每列缺失值百分比:通过自定义函数(如missing_values_table)统计
可视化分析
条形图(msno.bar(train)):直观展示各列数据完整性,可快速识别含缺失值的列(如泰坦尼克数据中的 “年龄”“客舱号码”“登船港口”)
热力图(msno.heatmap(train)):分析缺失值之间的相关性,辅助判断缺失原因
四:确实值的处理方法
1.删除缺失值
按行删除:train_1.dropna(subset = ['Age'],how = 'ang',inplace = True)
适用场景:缺失数据占比低,且缺失为随机分布
缺点:可能损失有价值信息,减少样本量
按列删除:train_1.drop(['Age',axis = 1])
适用场景:某列缺失值占比极高(如超过80%),且该列对分析意义不大
注意:谨慎使用,避免删除关键信息
2.填充缺失值
非时间序列数据
常亮填充:train_constant.fillna(0,inplace = True)(用 0 或其他指定常量填充)
统计量填充:如用均值填充train_mean['Age'].fillna(train_mean['Age'].mean(),inplace=True),还可使用中位数、众数等,适用于数据分布相对均匀的情况
时间序列数据
前向填充(ffill):用空值的上一个非空值填充,city_day.fillna(method = 'ffill',inplace = True)
后向填充(bfill):用空值的下一个非空值填充,city_day.fillna(method = 'bfill',inplace = True)
线性插值:假定数据点间为线性关系,利用相邻非缺失值计算缺失值,city_day.interpolate(limit_direction = 'both',inplace = True),适用于随时间呈现一定趋势的数据
高级方法
机器学习算法预测填充(如用回归模型根据其他特征预测缺失值),适用于缺失值较多且与其他特征存在较强关联的情况
五、总结与扩展
总结
1.缺失值普遍存在,来源包括原始数据和处理过程
2.Pandas中用NaN表示确实值,可通过isnull()等方法判断
3.处理方式包括删除(行/列)和填充(常亮、统计量、时间序列方法、算法预测)
扩展
1.缺失值处理原则:优先考虑填充,尽量保留数据信息;删除需谨慎,需评估对分析结果的影响
2.进阶技术:使用多重插补(生成多个完整数据集进行分析)、基于模型的填充(如 KNN 填充,根据相似样本的值进行填充)等
3.实际应用:在机器学习中,缺失值处理不当可能导致模型性能下降,需结合数据特点和模型要求选择合适的处理方式,如树模型对缺失值有一定的容忍度,而线性模型通常需要严格处理缺失值