Pandas DataFrame缺失值处理咨询:策略选择与最佳实践
Pandas缺失值处理策略与最佳实践
先明确:删还是填?
- 先统计缺失值比例:用
df.isnull().sum() / len(df)算出每列缺失占比,如果某列缺失超过70%-80%,直接删掉该列,这类特征对分析贡献极低,还会干扰结果。 - 行缺失判断:如果某行缺失列数超过一半,或者目标变量/核心特征缺失,直接用
df.dropna(subset=['target_col'])删掉该行;如果行缺失占比低,且缺失的是次要特征,优先考虑填充而非删除,避免丢失有效样本。
分类型处理缺失值
数值型列
- 统计量填充:
- 正态分布特征用均值:
df['num_col'].fillna(df['num_col'].mean(), inplace=True) - 偏态分布或含异常值用中位数:
df['num_col'].fillna(df['num_col'].median(), inplace=True) - 离散型数值用众数:
df['discrete_num'].fillna(df['discrete_num'].mode()[0], inplace=True)
- 正态分布特征用均值:
- 插值填充:时间序列或有顺序逻辑的数值,用线性插值更贴合数据规律:
df['num_col'].interpolate(method='linear', inplace=True)
类别型列
- 众数填充:最通用的方案,
df['cat_col'].fillna(df['cat_col'].mode()[0], inplace=True) - 新增“缺失”类别:如果缺失本身带有业务含义(比如用户不愿填写信息),直接填充为
'Missing':df['cat_col'].fillna('Missing', inplace=True),后续建模可将其作为独立类别分析 - 分组填充:基于关联特征的分组众数填充,比如按地区填充用户职业缺失:
df['cat_col'] = df.groupby('region')['cat_col'].transform(lambda x: x.fillna(x.mode()[0]))
最佳实践
- 先备份原始数据:操作前执行
df_raw = df.copy(),避免误操作后无法恢复原始数据 - 拒绝全局统一处理:针对不同列的特征类型、缺失原因、业务含义制定专属策略,别一股脑全删或全用均值填充
- 验证处理影响:处理后对比特征分布(比如用
df['num_col'].hist()查看数值分布变化),确保没有扭曲原始数据的规律 - 标记缺失状态:如果采用填充方案,建议新增列标记该位置是否曾缺失,比如
df['num_col_missing'] = df['num_col'].isnull().astype(int),后续建模可将其作为辅助特征
其他值得考虑的技术
- 模型预测填充:把缺失列作为目标变量,用随机森林、XGBoost等模型,以其他完整特征为输入预测缺失值,适合缺失比例中等(20%-50%)的场景
- K近邻填充:借助
sklearn.impute.KNNImputer,用相似样本的特征值填充缺失项,适合小数据集:from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=5) df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns) - 多重插补:用专业库生成多个填充后的数据集,分别分析后综合结果,适合需要严谨统计结论的场景
内容的提问来源于stack exchange,提问作者M Karachi
相关产品推荐
相关产品推荐

