求助: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
相关产品推荐
相关产品推荐

