SimpleImputer(strategy='mean')可自动按列均值填充NaN,但要求2D输入且转为float;纯NumPy推荐np.where(np.isnan(X), np.nanmean(X, axis=0), X);Pandas fillna(df.mean())容错最强但稍慢。

用 sklearn.impute.SimpleImputer 最省事但要注意默认行为
直接调用 SimpleImputer(strategy='mean') 能自动按列填充 NaN,适合预处理流水线。它内部对每列独立计算均值(跳过 NaN),再原地替换,不依赖 Pandas —— 如果你数据已经是 numpy.ndarray,它也能处理。
但注意:它默认只支持 2D 输入,且会把整列转为 float(哪怕原始是 int)。如果传入 1D 数组会报错 ValueError: Expected 2D array, got 1D array instead。
- 必须确保输入是二维:用
X.reshape(-1, 1)包一层,或保持(n_samples, n_features)形状 - 若原始数组是
int类型,填充后会变成float64;如需保留类型,得手动 cast 回去(但均值本身大概率是浮点) - 它不会修改原数组,而是返回新数组,别忘了赋值
纯 NumPy 实现:用 np.nanmean + np.isnan 定位
不引入额外依赖时,这是最可控的方式。核心思路是:对每列算 np.nanmean(col),再用布尔索引把该列中 np.isnan(col) 的位置替换成均值。
关键点在于避免循环列——用 axis=0 让 np.nanmean 沿行方向压缩,得到每列一个均值;再用广播机制一次性填入。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 对二维数组
X,col_means = np.nanmean(X, axis=0)返回 shape=(n_cols,) 的均值数组 -
mask = np.isnan(X)得到同形状布尔矩阵,X[mask] = col_means[np.newaxis, :][mask]这种写法易错;更稳的是逐列处理或用np.where - 推荐写法:
X_filled = np.where(np.isnan(X), np.nanmean(X, axis=0), X)—— 注意np.where会广播第二、三参数,所以均值数组自动对齐每行
用 Pandas 中转:看似绕路实则容错最强
如果你的数据已经混在 DataFrame 里,或者列名/类型信息重要,用 pd.DataFrame.fillna(df.mean()) 反而最安全。Pandas 的 mean() 默认跳过 NaN,且能天然处理混合类型列(只对数值列生效),还能保留索引和列名。
- 从 NumPy 数组开始:先
df = pd.DataFrame(X),再df_filled = df.fillna(df.mean()),最后用df_filled.to_numpy()拿回数组 - 注意:如果某列全为 NaN,
df.mean()返回NaN,fillna不会改动该列 —— 这是合理行为,但容易被忽略,建议提前检查df.isna().all() - 性能上比纯 NumPy 稍慢,但开发阶段省去类型推断和边界判断,实际调试成本更低
为什么不用 np.mean 直接算?
np.mean 遇到 NaN 就让整列结果变 NaN,没法直接用。比如 np.mean([1, 2, np.nan]) 返回 nan,不是 1.5。必须显式启用跳过逻辑。
-
np.nanmean是专为此设计的,语义清晰,且底层优化过,比手写np.mean(arr[~np.isnan(arr)])更快也更稳 - 旧代码里有人用
np.ma.masked_invalid(arr).mean(),功能等价但对象构造开销大,不推荐 - 如果数组含
inf,np.nanmean默认仍会参与计算(除非加keepdims=False和额外过滤),这点和sklearn行为一致,但和 Pandas 的mean(skipna=True)略有差异
实际替换时,最容易漏掉的是全 NaN 列的兜底处理——无论用哪种方法,都得确认该列是否还有有效值可算均值,否则填进去的还是 NaN。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










