处理缺失值时 fillna 和 dropna 的选择依据是什么场景?

文章导读
处理缺失值时选择 fillna 还是 dropna,核心依据是缺失值在业务中是否具有有效信号意义以及下游任务的需求。若缺失本身代表特定状态(如设备离线)、填充会扭曲统计逻辑(如 t 检验)或导致分类变量分布失真,应优先使用 dropna 删除。若需保留样本结构、处理时间序列或缺失率较低,则使用 fillna 填充。具体策略需结合数据类型(数值型、分类型、时间型)及后续模型要求,避免盲目填充导致数据
📋 目录
  1. Python 缺失值怎么处理_dropna 删除与 fillna 填充策略解析
  2. 为什么你的数据清洗总出错?深度解析 dropna 与 fillna 陷阱-CSDN 博客
  3. python 数据分析 (数据清洗与准备——处理缺失值)
  4. Python 处理数据中的空值 (缺失值) 时用到的 dropna() 函数和 fillna() 函数总结,通过示例弄懂这两个函数的用法。
  5. FAQ
A A

处理缺失值时选择 fillna 还是 dropna,核心依据是缺失值在业务中是否具有有效信号意义以及下游任务的需求。若缺失本身代表特定状态(如设备离线)、填充会扭曲统计逻辑(如 t 检验)或导致分类变量分布失真,应优先使用 dropna 删除。若需保留样本结构、处理时间序列或缺失率较低,则使用 fillna 填充。具体策略需结合数据类型(数值型、分类型、时间型)及后续模型要求,避免盲目填充导致数据穿越或分布偏移,同时慎用 inplace 参数以防链式调用失效。

Python 缺失值怎么处理_dropna 删除与 fillna 填充策略解析

结论:优先用 dropna 而非 fillna,当缺失值本身是有效信号 (如设备离线)、填充会扭曲计算逻辑 (如 t 检验) 或导致分布失真 (如高缺失率分类变量) 时必须 dropna。直接说结论:用 dropna 还是 fillna,不看“缺不缺”,而看“缺的值在业务里有没有意义”——比如用户注册时间为空,删掉可能丢转化漏斗;但传感器某次读数为空,填均值反而污染趋势。什么时候必须用 dropna 而不是填一个数 核心判断点:缺失本身是有效信号,或填充会扭曲后续计算逻辑。做时间序列建模时,fillna 用前向填充 (method="ffill") 可能让模型误以为“数据一直没变”,但实际是设备离线——这时宁可删整行,保留“断连”的真实节奏 分类变量 (如"gender") 缺失率达 40%,填"unknown"会让类别分布失真;而 dropna 后若剩余样本仍满足最小支持度,就该删 调用 scipy.stats.ttest_ind 等统计函数前,它们内部不自动处理 NaN,强制填 0 或均值会导致 p 值失效——必须先 dropna,否则报错 ValueError: Input contains NaN fillna 填什么,取决于列类型和下游任务 填错值比留空更危险。数值型、分类型、时间型,策略完全不同。数值列 (如"price"): 预测任务:用中位数 (df["price"].median()),比均值抗异常值干扰 回归任务:用随机森林拟合其他特征来预测缺失值 (sklearn.ensemble.RandomForestRegressor),但注意别造成数据穿越 分类型 (如"category"): 不能填 0 或"missing"就完事——如果后续要做 pd.get_dummies,得提前确认"missing"是否在训练集出现过,否则测试时报 KeyError 更稳的做法是单独加一列 is_category_missing(布尔型),再对原列用众数填充 时间列 (如"order_time"): 填 pd.NaT 是安全的,但某些数据库写入时会转成 1970-01-01;如果下游是 ClickHouse,得填"1970-01-01 00:00:00"字符串才兼容 inplace=True 在 dropna 和 fillna 里到底要不要用 绝大多数情况——别用。它看似省内存,实则埋坑。函数链式调用时失效:df.dropna().fillna(0) 中 inplace=True 会让第一句返回 None,第二句直接报 AttributeError: 'NoneType' object has no attribute 'fillna' Jupyter 里调试时,如果某步用了 inplace=True,再想回退只能重启 kernel,因为原 df 已被改写 唯一可考虑的场景:处理超大 DataFrame(>5GB),且确定后续不再需要原始缺失状态——但更推荐用 dask 或 polars 替代 pandas 真正麻烦的从来不是“怎么填”,而是填完之后没人再检查分布偏移。比如填完中位数,df["age"].describe() 看似正常,但画个直方图会发现 35 岁堆成尖峰——那说明缺失集中在某个用户群,(来自 2026 年 3 月 22 日的资料)

为什么你的数据清洗总出错?深度解析 dropna 与 fillna 陷阱-CSDN 博客

第二章:dropna 核心机制与常见误用场景 2.1 dropna 的参数解析与默认行为陷阱 dropna() 是 Pandas 中用于处理缺失值的核心方法,但其默认行为可能引发数据意外丢失。关键参数详解 axis:默认为 0,即删除包含 NaN 的行;设为 1 则删除列; how:可选 'any' 或 'all',决定是否仅当全部值为空时才删除; thresh:指定非空值的最小数量,满足条件则保留; subset:限定在某些列或行范围内判断缺失值。常见陷阱示例 # 默认行为可能导致整行被删 df.dropna() # 若某列大量缺失,即使其他列完整也可能被剔除 AI 写代码 上述代码未指定参数时,只要某行存在任一 NaN,整行都会被删除,易造成有效数据损失。(该信息的时间戳是 2025 年 10 月 30 日)

python 数据分析 (数据清洗与准备——处理缺失值)

一、NA 处理方法 1、NA 处理方法说明:2、NA 处理方法实例:(1) dropna():根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阙值 默认 aixs=0,how="any",删除带有空值的行,只要有一个空值,就删除整行:axis=1,删除带有空值的列,只要有一个空值,就删除整列 (不支持 Series 结构的数据): (2) fillna():用某些值填充缺失的数据或使用插值方法 (如"ffill" 或"bfill") bfill():用相邻后面 (back) 特征值填充前面空值:ffill():用相邻前面 (before) 特征值填充后面空值:(3) isnull():返回表明哪些值是缺失值的布尔值 Python 内建的 None 值在对象数组中也被当做 NA 处理:(4) notnull():返回表明哪些值不是缺失值的布尔值 二、过滤缺失值 有多种过滤缺失值的方法。虽然我们可以使用 pandas.isnull 和 布尔值索引 手动地过滤缺失值,但 dropna 在过滤缺失值时是非常有用的。1、使用 dropna 在 Series 数据集中过滤缺失值数据 等价于:2、使用 dropna 在 DataFrame 数据集中过滤缺失值数据 (1) 过滤行数据:dropna 默认情况下会删除包含缺失值的行:传入 how="all" 时,将删除所有值均为 NA 的行:(2) 过滤列数据:传入 axis=1,删除包含缺失值的列:传入 axis=1, how="all" 时,将删除所有值均为 NA 的列:(3) 往 dropna 中传入参数 thresh,保留包含一定数量的观察值的行 (thresh=n,保留至少有 n 个非 NA 数的行) 0、1、2、3 行 1 列的特征值为 NA: 设置前 0、1 行 2 列的特征值为 NA: 调用 dropna 函数,不传参:调用 dropna 函数,传入参数 thresh=1,保留至少有 1 个非 NA 数的行:调用 dropna 函数,传入参数 thresh=2,保留至少有 2 个非 NA 数的行:调用 dropna 函数,传入参数 thresh=3,保留至少有 3 个非 NA 数的行:调用 dropna 函数,传入参数 thresh=4,保留至少有 4 个非 NA 数的行:三、补全缺失值 1、使用 fillna 方法补全缺失值 fillna 函数参数:(1) 调用 fillna 时,使用一个常数来替代缺失值:设置前 0、1、2、3 行 1 列的特征值为 NA: 设置前 0、1 行 2 列的特征值为 NA: 使用常数 0 替代缺失值:(2) 调用 fillna 时,使用字典,可以为不同的列设定不同的填充值:设置前 设置前 0、1、2、3 行 1 列的特征值为 NA:(2020 年 7 月 30 日)

处理缺失值时 fillna 和 dropna 的选择依据是什么场景?

Python 处理数据中的空值 (缺失值) 时用到的 dropna() 函数和 fillna() 函数总结,通过示例弄懂这两个函数的用法。

(一)、dropna() 函数的用法。 (二)、fillna() 函数的用法 (一)、dropna() 函数的用法。dropna(axis,how,thresh,subset,inplace) 参数说明:axis:这个参数默认为 0,当等于 0 时代表的是删除空值 nan 所在的行,当等于 1 时删除空值所在的列。how:这个参数的值默认为'any',表示的是删除空值所在的行或者是列,这个主要看前面的 axis 参数你设定是 0 还是 1;当参数等于'all',表示的是删除一阵行或者是一整列都为空值 nan 的行或者列,如果你的某一行或某一列,不全为空值的话,则不会删除,即不起作用。thresh:这个参数是一个整数 x,意思是保留空值 nan 的数量小于 x 的每一行或者是每一列。比如我设置 x=2,那么我每一行或者是每一列的非空值的数量大于等于 2 的行或者列都会被保存,具体是行还是列,那还是看前面的 axis 参数的设置。subset:这个参数的意思是指定删除特定行或列的空值所在的列或行,如果 axis=0,表示如果指定行 x 中有空值,则删除所在的列;如果 axis=1,表示如果指定列 x 有空值,则删除空值所在的行。inplace:这个参数默认为 False,它的意思是你在处理空值 nan 时,是在原数据上处理还是在先把原数据复制一份,然后在副本上处理,在副本上处理的时候,原数据不受任何影响;如果 inplace 设置为 True,那代表你在原数据上进行处理,原数据直接受影响。(撰于 2022 年 3 月 30 日)

FAQ

什么时候必须用 dropna 而不是 fillna?

当缺失本身是有效信号 (如设备离线)、填充会扭曲计算逻辑 (如 t 检验) 或导致分布失真 (如高缺失率分类变量) 时必须 dropna。

fillna 填充什么值取决于什么因素?

处理缺失值时 fillna 和 dropna 的选择依据是什么场景?

取决于列类型和下游任务。数值列预测任务用中位数,回归任务可用随机森林拟合;分类型不能随便填 0,需确认类别是否在训练集出现过;时间列填 pd.NaT 或兼容字符串。

inplace=True 在 dropna 和 fillna 里要不要用?

绝大多数情况别用。函数链式调用时会失效返回 None,Jupyter 调试难以回退。仅处理超大 DataFrame 且确定不再需要原始缺失状态时可考虑,但更推荐用 dask 或 polars。