python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框/单元格 值判断nan

时间:2021-10-15 20:20:01

pandas中DataFrame,Series 都有 isnull()方法,而数据框/单元格却没有,用了就会报错:AttributeError: 'float' object has no attribute 'isnull'

  怎么判断单个框是否为 np.nan?

 

索引一个单元格,用 is 判断

pd.ix[60009,u'团队'] is np.nan

 

===========================================

Python常规的判断,==,和is, 这对None是有效的

  None is None
  Out[49]: True

  None == None
  Out[50]: True

 ==========================================

  而对,np.nan,只能用is

da1pd.ix[6000996,u'团队'] == np.nan
Out[41]: False

da1pd.ix[6000996,u'团队'] is np.nan

Out[42]: True

 

np.nan == np.nan
Out[43]: False

 ==================================

  np.nan也不是None

None == np.nan
Out[46]: False

None is np.nan
Out[48]: False

 

 is 、== 的判断方法不同,is 判断是否为同一个对象

  1 is 1
  Out[51]: True

而’== ’ 是值判断,两个变量值是否相等。

  u = 156

  v = 156

  u is v
  Out[58]: True

#因为,Python,对变量赋值是用的引用,默认传的是地址,所以,赋的是同一个 对象,也会是 同一个对象

  u = 156.0

  u is v
  Out[60]: False

  u == v
  Out[61]: True

# 一个赋值整数,一个赋值浮点数时就 不指向一个对象了。 只是值相等而已

#注意:当数字过大时,超过256时也是不同的对象,因为数字过大解析器并没有保存

a = 250
a
is 250
Out[
65]: True

a
= 257
a
is 257
Out[
67]: False

a
= 256
a
is 256
Out[
69]: True

 

回到开始,np.nan 应该是没有值的,所以不能值判断,只用对象引用判断,而None有空值,所以也可以值判断。

#补充之前的浅陋认识,np.nan 重载了“==” 运算符,dir(np.nan)就能看到"__eq__",翻了一下模块文件,没找到定义np.nan的源代码在哪.....

#补充+1, 这次找到了,np.nan是在C:\Program Files (x86)\Anaconda2\lib\site-packages\numpy\core\numeric.py 下引入的

       python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框/单元格 值判断nan

     那个umath其实是 C:\Program Files (x86)\Anaconda2\Lib\site-packages\numpy\core\umath.pyd

      pyd 传说中的扩展包,numpy底层是C写的。。。