numpy中缺失值统一用np.nan表示,仅兼容浮点类型;整型或字符串数组赋np.nan会触发类型转换或报错;判断缺失需用np.isnan()而非==;统计需用np.nanmean等函数;混合类型数据建议改用pandas。

NumPy中np.nan不是“空值”,而是浮点型特殊标记
NumPy本身不支持None或SQL风格的NULL,所有缺失值统一用np.nan(Not a Number)表示——但它只兼容浮点类型。一旦数组是int、bool或str,直接赋np.nan会触发静默类型转换或报错。
- 整型数组赋
np.nan:自动转为float64,原类型丢失 - 字符串数组赋
np.nan:抛出TypeError: Cannot convert float NaN to integer(实际是类型不匹配) -
np.array([1, 2, None]):None被转成np.nan,但dtype变成float64,且无法区分“原始None”和“计算产生的NaN”
所以别指望用arr == np.nan判断缺失——它永远返回False。必须用np.isnan(arr)。
用np.where和np.nanmean做条件填充与聚合
处理缺失值最常见动作是“用均值/中位数填充”或“跳过缺失值计算统计量”。关键在于函数是否默认忽略np.nan:
-
np.mean(arr)遇到np.nan直接返回np.nan;必须显式写np.nanmean(arr) -
np.std/np.var同理,对应有np.nanstd、np.nanvar - 填充时别直接
arr[np.isnan(arr)] = np.nanmean(arr)——这会改变原数组dtype(尤其当原为int);建议先arr = arr.astype(float)再操作 - 多维数组要指定
axis:np.nanmean(arr, axis=0)按列求均值,结果形状为(n_cols,)
示例:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
import numpy as np<br>arr = np.array([1.0, 2.0, np.nan, 4.0])<br>filled = np.where(np.isnan(arr), np.nanmean(arr), arr) # → [1. 2. 2.333 4.]
混合类型数据?别硬扛,该换pandas就换
NumPy对缺失值的支持本质是“妥协方案”:它要求整个数组统一dtype,而真实数据常含整数、字符串、时间戳混杂。此时强行用object dtype存,会导致:
-
np.isnan()在object数组上失效(报TypeError) - 无法使用向量化函数(如
np.sum),性能暴跌 - 缺失标识混乱:
None、np.nan、空字符串''可能并存,且np.isnan只认后者
如果数据含非数值列、需分列填充策略、或要保留原始类型,直接转pandas.DataFrame更可靠:df.fillna({'col_a': 0, 'col_b': 'unknown'})比手写循环清晰得多。
序列化时np.nan会变成null,但JSON不认inf
用json.dumps(arr.tolist())导出NumPy数组时,np.nan→null,np.inf→Infinity(JSON非法)。若后端是严格JSON解析器,会报错。
- 安全做法:导出前用
np.nan_to_num(arr, nan=0.0, posinf=1e10, neginf=-1e10)替换极端值 - 或改用
numpyEncoder类重写json.JSONEncoder,但多数场景不如先转pandas再用df.to_json(orient='records', na='null') - 注意
np.nan_to_num默认把inf转成np.finfo(float).max,这个值可能超出下游系统接收范围
真正麻烦的是那种“以为填了均值就万事大吉,结果导出时inf炸了接口”的情况——得在序列化前加一道检查:np.isfinite(arr).all()。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










