nan是什么:别把它当0
nan是什么?在 Python、JavaScript、Excel 导出的数据里,它通常表示“不是一个有效数字”。最容易踩坑的是:它看起来像空值,算起来又会污染结果。下面用逐项对比,把 nan、None、null、空字符串、0 的区别讲清楚。
nan vs 0:一个是缺失,一个是真值
我见过最常见的事故,是把用户年龄里的 nan 批量填成 0。报表一出,0 岁用户突然暴涨,运营还以为来了大量新生儿。nan是什么?它不是“数值为零”,而是“这里本该是数字,但现在算不出来或没有有效数字”。
0 可以参与计算,平均值、求和、排序都合理。nan 一旦进了普通算术,结果往往继续是 nan。比如 pandas 里某列有 nan,均值默认会跳过它;但在很多底层计算里,nan 会像墨水滴进清水,后续结果也变脏。
nan vs None/null:来源不同,处理方式也不同
None 是 Python 里的“没有对象”,null 常见于 JSON 和 JavaScript,表达的是“这里没有值”。nan 更窄,它主要出现在数值场景:浮点运算失败、数据缺失、类型转换失败。
举个实战例子:CSV 里有一列价格,空白单元格读进 pandas 后常变成 NaN;接口 JSON 里某字段没传,读进来可能是 None。两者都像空,但清洗时不能一锅端。价格缺失可以用中位数补,用户昵称 None 不该补成一个数字。
nan vs 空字符串:肉眼相似,机器完全不同
空字符串是 '',长度为 0,类型仍是字符串。nan 是浮点体系里的特殊值。Excel 导出的表最容易混:有的单元格是真的空,有的是空字符串,有的是公式算错后被工具读成 nan。
判断时不要靠肉眼。Python 里可以用 pandas.isna() 检查缺失,用 value == '' 检查空字符串。注意一个反直觉点:float('nan') == float('nan') 的结果是 False,所以别用等号判断 nan。
nan vs inf:一个无效,一个无限大
inf 表示无穷大,常见于除以非常接近 0 的数、溢出计算。nan 表示不是数字,常见于 0/0、无效开方、脏数据转换。二者都会让模型训练、统计指标、图表显示异常。
排查时我通常分两步:先统计 df.isna().sum() 看 nan,再用 numpy.isinf() 看 inf。很多人只查缺失值,结果模型 loss 爆炸,最后发现是 inf 藏在某个比率字段里。
怎么记住 nan 的本质
一句话:nan 是数值世界里的“坏票据”。它占着数字的位置,但不能当正常数字用。看到 nan,先问三个问题:它从哪来?能不能删除?要不要填补?
如果是少量随机缺失,删除可能最快;如果是关键字段缺失,最好回源修数据;如果是建模特征,填补前要加一个“是否缺失”的标记列,很多业务里缺失本身就有信息量,比如用户没填收入,往往不是随机事件。
常见问题
- nan是什么缩写?
- nan 通常是 NaN,Not a Number 的缩写,意思是“不是一个数字”。它常见于浮点计算、Python pandas、NumPy、JavaScript 等场景。
- nan可以直接替换成0吗?
- 不建议默认替换成 0。0 是真实数值,nan 是缺失或无效。只有在业务上确认“缺失就等于0”时才可以,比如优惠券使用次数缺失且系统规则明确为0。
- 为什么 nan 不等于自己?
- 这是 IEEE 浮点标准里的设计。nan 代表不确定的无效数值,两个无效结果不能简单认为相等,所以判断 nan 要用 isna、isnan 这类函数。