df.fillna('', inplace=True)没有成功把 NaN 替换为空字符串

9 阅读1分钟

如果 df.fillna('', inplace=True) 没有成功把 NaN 替换为空字符串,可能有以下原因:


✅ 正确语法(本身没问题):

df.fillna('', inplace=True)

这句代码是正确的,它应该把 所有列中的 NaN 替换为 ''(空字符串)


🚨 常见原因分析:

1. DataFrame 实际没有 NaN,而是 None 或空字符串

  • fillna('') 只处理真正的 np.nan,不会处理 None(在某些情况下,尤其是 object 类型)或已存在的 ''
  • 你可以用 df.isna().sum() 检查每列里是否真的有 NaN。

2. 有些列是非字符串类型(如 float、int)

  • 如果某列是数值类型(比如 float64),你用空字符串填充,会导致 类型冲突,Pandas 会跳过或报错。

    ✅ 解决办法是先把该列转成字符串:

    df = df.astype(str).fillna('')
    

    或只对对象类型列填充空字符串:

    df[df.select_dtypes(include='object').columns] = df.select_dtypes(include='object').fillna('')
    

3. 你看见的 "nan" 其实是字符串 'nan'

  • 某些场景(比如用 str() 转换列之后),NaN 变成了字符串 'nan',不是 np.nan

    ✅ 可用以下方式替换掉:

    df.replace('nan', '', inplace=True)
    

🔍 推荐你执行以下几步排查:

import numpy as np

# 1. 查看哪里是 NaN
print(df.isna().sum())

# 2. 如果你想统一所有 NaN、None、'nan' 都替换为空字符串
df = df.replace([np.nan, None, 'nan'], '')

# 或者更彻底一点,强转为字符串后替换:
df = df.astype(str).replace('nan', '')