python 值比較判斷,np.nan is np.nan 卻 np.nan != np.nan ,pandas 單個數據框/單元格 值判斷nan


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 下引入的

       

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

      pyd 傳說中的擴展包,numpy底層是C寫的。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM