缺失值处理三选一:fillna、dropna、interpolate 各适合什么场景?
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
先看缺失比例再选策略: df.isnull().sum() 看每列缺失量,缺失 >30% 的列通常直接删列。
一、dropna:删除缺失行/列
df.dropna() # 删所有含缺失的行
df.dropna(subset=["age", "city"]) # 只按关键列判断
df.dropna(how="all") # 整行全空才删
df.dropna(thresh=3) # 行内非空值 <3 个才删
df.dropna(axis=1) # 删含缺失的列
适合: 缺失比例很小(<5%)、且缺失行对分析无影响时。
二、fillna:填充缺失值(最常用)
df["age"].fillna(0) # 固定值(0 表示"无",慎用于均值分析)
df["age"].fillna(df["age"].mean()) # 均值(分布对称时)
df["age"].fillna(df["age"].median()) # 中位数(有异常值时更稳,推荐)
df["city"].fillna(df["city"].mode()[0]) # 众数(类别列)
df.fillna(method="ffill") # 前向填充:用上一行值(时间序列)
df.fillna(method="bfill") # 后向填充
df["age"].fillna(df["age"].interpolate()) # 线性插值
适合: 缺失较多但业务上"填充一个合理值"可接受;时间序列用 ffill/插值。
三、interpolate:插值(时间序列/平滑场景)
df["price"].interpolate() # 线性插值:用前后值推算中间
df["price"].interpolate(method="time") # 按时间间隔插值
适合: 传感器、股价等连续型时间序列,缺失值按趋势补齐。
选择口诀: 少量缺失→删;数值分布稳定→中位数/均值填;时间序列→ffill 或 interpolate;类别→众数。注意:填充会引入偏差,重要模型里建议加一列"是否缺失"标记。
回复
0 条回复