Python缺失值标准填充方法咨询:小数据集无法删行的处理方案
嘿,这两个问题都是数据预处理里的经典痛点,我结合实际项目经验给你梳理清楚:
1. Python中填充缺失值的标准方法
下面是几种工业界常用的填充手段,适配不同场景:
- 统计量填充(数值/类别特征通用):
数值型优先用中位数(避免异常值干扰),有明显众数的类别型直接用众数填充,是最稳妥的基础方案:import pandas as pd # 中位数填充数值列 df['age'].fillna(df['age'].median(), inplace=True) # 众数填充类别列(mode返回Series,取第一个值) df['gender'].fillna(df['gender'].mode()[0], inplace=True) - 常数填充:
如果缺失值有明确业务含义(比如用户未填写),直接用固定值标记,比如'Unknown'或0(注意0只适合确实表示“无”的场景):df['occupation'].fillna('Unknown', inplace=True) df['income'].fillna(0, inplace=True) - 前后向填充(时序数据专属):
针对时间序列或有顺序的数据集,用相邻的有效值填充,能保留数据的连续性:df['daily_sales'].fillna(method='ffill', inplace=True) # 用前一天数据填充 df['daily_sales'].fillna(method='bfill', inplace=True) # 用后一天数据填充 - 插值填充:
适合有连续趋势的数值数据,比如线性插值、时间插值,比简单统计量填充更贴合数据规律:df['temperature'].interpolate(method='linear', inplace=True) - 模型预测填充:
用其他完整特征训练简单模型(比如KNN、线性回归)预测缺失值,适合缺失比例适中且数据有相关性的场景,但要注意避免过拟合:from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=3) # 小数据集建议k取2-3 df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
2. 小数据集多列缺失且无法删除行的标准处理流程
小数据集容错率极低,不能随便套用通用方法,得按以下步骤谨慎处理:
先做缺失值诊断
先搞清楚缺失的本质:各列缺失比例、缺失是否和其他特征相关(比如某类用户集体不填某个字段):# 查看各列缺失比例 print(df.isnull().sum() / len(df)) # 可视化缺失分布(看是否有规律) import seaborn as sns sns.heatmap(df.isnull(), cbar=False)如果是非随机缺失,别直接填充,先新增一个
[col]_is_missing的二值特征(0=无缺失,1=有缺失),把缺失本身作为信息保留。分特征类型选填充策略
- 数值型特征:优先用中位数(小数据集均值波动大,容易被异常值带偏);如果是时序数据,用前后向填充。
- 类别型特征:优先新增“Missing”类别(比强行填充众数更合理,小数据集的众数可能不具代表性),如果缺失比例极低(<3%)再考虑众数填充。
拒绝过度复杂的填充方法
小数据集用复杂模型(比如随机森林)预测缺失值很容易过拟合,会把噪声当成规律。如果一定要用模型填充,就选最简单的KNN,并且用交叉验证确认效果。验证填充效果
填充后用简单模型(比如逻辑回归、决策树)做交叉验证,对比填充前后的模型性能。如果性能下降,说明填充策略破坏了数据规律,得调整。
内容的提问来源于stack exchange,提问作者TechGeek




