DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

缺失值处理三选一: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;类别→众数。注意:填充会引入偏差,重要模型里建议加一列"是否缺失"标记。

下载推广海报

圈内讨论推广海报

《缺失值处理三选一:fillna、dropna、interpolate 各适合什么场景?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。