0 前言
数据分析师在使用python进行数据分析时,经常会遇到 Nan 和 None 这两个数据缺失值,但它们两并不互相等价,有很多细微的差别。笔者将在下面对 Nan 和 None 进行细致的介绍。
1 什么是 Nan 和 None ?
Nan(not a number) 和 None 都是 python 里的数据缺失值,表示当前某些数据为“空”。
数据缺失值指现有数据集中某个或某些属性的值存在不完全的空值。
更准确的说,Nan 是出现在 numpy/pandas 里的缺失值,而 None 是 Python 的缺失值。某种意义上,None 是比 Nan 更高级、更彻底的空值。
2 Nan 和 None 的异同点
我们可以通过数据本身、其他类型函数、pandas等方面来比对。
2.1 数据本身
数据类型?
type(None) # NoneType
type(np.nan) # float
我们可以很直接的看到,在 python 里 None 是有着自己的独特类型(NoneType),而 Nan 则是属于 float 类型。
Nan 因为自身属于浮点数(特殊的float),从而能够参加部分运算。但 None 则不能参与任何运算。
等值性?
None == None # TRUE
None == np.nan # False
np.nan == np.nan # False
np.nan is np.nan # True
id(np.nan) == id(np.nan) # True
可以看到在这里,None 和 Nan 的表现也是不同的。
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
a is b 相当于 id(a)==id(b),id() 能够获取对象的内存地址。
为什么 np.nan == np.nan 结果是 False,这涉及到 python 的另一个坑,有兴趣的同学可以参考这里
2.2 可迭代对象的表现
list 的表现
None 和 Nan 在 list 里的表现和等值性相同:
lst = [np.nan, None]
lst[0] == lst[0] # False
lst[0] == lst[1] # False
lst[1] == lst[1] # True
[np.nan, 1] == [None, 1] # False
dict 的表现
首先看在 key 值的表现:
print([i for i in {np.nan:1, None:1}]) # [nan, None]
{np.nan:1} == {np.nan:1} # True
我们可以看到,无论是 Nan 还是 None,都是可以作为 dict 的 key 值的。且互不相同(dict 不允许有相同 key 值)。
再看看 value 值:
dic = {'a':np.nan, 'b':None, 'c':np.nan, 'd':None}
print(dic['a'] == dic['b']) # False
print(dic['a'] == dic['c&