You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Pandas的fillna()方法填充NaN后仍存在空值问题

排查fillna()未生效的问题

我来帮你揪出这个问题的根源!这种情况我自己在处理DataFrame的时候也遇到过好几次,大概率是下面这几个原因导致的:

  • fillna()没修改原DataFrame
    这个是最常见的坑!fillna()默认会返回一个填充后的新DataFrame,而不会直接修改原来的那个。如果你只是写了df.fillna(df.mean())却没把结果存回去,原数据里的NaN根本没变化。
    正确的写法二选一:

    # 方法1:把填充后的结果赋值回原变量
    df = df.fillna(df.mean())
    # 方法2:用inplace=True参数原地修改
    df.fillna(df.mean(), inplace=True)
    
  • 均值计算没覆盖所有需要填充的列
    你说检查了所有列的均值不为NaN,但可能忽略了非数值型列?df.mean()默认只会计算数值列的均值,像字符串、布尔类型的列,它不会处理,这些列里的NaN会原封不动保留下来,自然会触发后续的if判断。
    你可以先跑下面的代码看看哪些列还留着NaN:

    print(df.isna().sum())
    

    如果是非数值列的问题,可以用众数来填充这类列:

    # 数值列用均值,非数值列用众数填充
    df = df.fillna(df.mean(numeric_only=True)).fillna(df.mode().iloc[0])
    
  • 判断逻辑的变量没更新
    有没有可能你在填充之后,用的还是填充前的DataFrame变量?比如填充完没赋值,直接去判断原df,那肯定还能看到NaN。或者你的判断写法有问题?比如检查行是否有NaN的时候,是不是用了df.isna().any()而不是df.isna().any(axis=1)?

给你一个完整的验证流程,你可以照着跑一遍,就能清楚问题出在哪了:

# 1. 先看原始数据的NaN分布
print("原始NaN统计:")
print(df.isna().sum())

# 2. 确认均值计算的范围(只针对数值列)
mean_values = df.mean(numeric_only=True)
print("\n数值列均值:")
print(mean_values)

# 3. 执行填充并更新df
df = df.fillna(mean_values)

# 4. 检查填充后的NaN情况
print("\n填充后NaN统计:")
print(df.isna().sum())

# 5. 再执行你的判断逻辑
if df.isna().any(axis=1).any():
    print("\n仍存在NaN的行:")
    print(df[df.isna().any(axis=1)])
else:
    print("\n所有NaN都被成功填充啦!")

内容的提问来源于stack exchange,提问作者Acrofales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:11:02