
本文介绍在pandas dataframe中批量将nan值替换为0的最优方法,并结合实际计算场景,提供安全、向量化、可维护的数据预处理方案。
在数据处理中,频繁遇到NaN(Not a Number)导致数值计算失败或逻辑异常的问题。如示例代码所示,原始做法是在循环中逐行判断math.isnan()并手动处理,不仅性能低下(iterrows()会破坏向量化优势),还容易因类型转换(如float(row["col"])对非数值或空字符串报错)引发异常。
✅ 最优解:使用 fillna() 进行全局/定向填充
Pandas 提供了高度优化的 fillna() 方法,可一次性将指定列或整个DataFrame中的NaN替换为指定值(如0):
import pandas as pd
df = pd.read_csv('documents/doc.csv', on_bad_lines='skip') # 替代已弃用的 error_bad_lines
# 方案1:整表NaN → 0(最简)
df = df.fillna(0)
# 方案2:仅对特定数值列填充(更安全,避免误改文本列)
numeric_cols = ["first column", "second column", "third column", "fourth column", "fifth column"]
df[numeric_cols] = df[numeric_cols].fillna(0)⚠️ 注意:fillna(0) 默认不修改原DataFrame,需赋值回df;若想就地修改,可加参数 inplace=True(但推荐链式赋值,更清晰可控)。
? 进阶建议:替代循环,用向量化计算提升效率与健壮性
避免iterrows() + 手动类型转换。直接利用Pandas的向量化运算和numpy.where实现条件逻辑:
import numpy as np
# 确保目标列为数值类型(自动将非数字转为NaN,再统一填充)
cols = ["first column", "second column", "third column", "fourth column", "fifth column"]
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce').fillna(0)
# 向量化计算 final_grade
var1, var2, var3 = df["first column"], df["second column"], df["third column"]
var4, var5 = df["fourth column"], df["fifth column"]
# 条件赋值:当 var4 为 0 或 NaN(已填0,故只需判0)时走分支1,否则分支2
df["final_grade"] = np.where(
var4 == 0,
np.round(0.25 * (var1 + var2 + var3) / 3 + 0.75 * var5, 1),
np.round(0.166 * (var1 + var2 + var3) / 3 + 0.33 * var4 + 0.5 * var5, 1)
)总结
- ✅ 优先用 df.fillna(0) 替代手动NaN检查,简洁高效;
- ✅ 结合 pd.to_numeric(..., errors='coerce') 自动清洗非数值数据;
- ✅ 用向量化运算(np.where, 算术运算符)彻底取代iterrows()循环,提升性能百倍以上;
- ❌ 避免在循环中重复类型转换和异常捕获——这掩盖了数据质量问题,应前置清洗而非后置容错。










