在用numpy
和pandas
處理資料的時候
我們很常會遇到需要nan
的情況
而最初在處理它的時候,就因為要判斷相等的方式用錯而繞了不少彎路
我當初就是這個表情
Nan(Not a Number的縮寫),在資訊科學中用來表示未定義的值
而在使用pandas
讀取表格資料的時候,如果遇到了空的欄位也會被存儲成nan的形式
但
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a is b)
print(a is c)
初次在面對is
和==
的時候可能會容易混淆
想說明明三個東西不都是[1,2,3]
嗎?為什麼會不相同呢
而這個會和python對於記憶體管理的機制有關
讓我們來用id()
來協助我們看一下不同變數的情況
print(id(a))
print(id(b))
print(id(c))
我們可以發現a
和c
的id是相同的,表示這兩個變數實際上在記憶體是儲存在同一塊區域的
因此這個時候我們用判斷是否為同一個東西的is的時候自然就會得到a和c相同,而a和b不同的結果了
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b)
print(a == c)
因為==
是在考慮值是否相同,因此就算是儲存在不同記憶體位置的變數,只要裡面的值是相同的就會得到True的結果
那為我們再看一個例子
a = np.nan
b = np.nan
print(a == b)
print(a is b)
誒這奇怪了,為什麼是同一個東西卻不相等呢?
然我們檢查一下這兩個變數的記憶體
print(id(a))
print(id(b))
確實是儲存在同一個記憶體的同一個東西,那為何會不相等呢?
原因其實是來自np.nan
對相等的定義——對於任何比較的值,np.nan
都會視為不相等
因此只要把它放上==
的時候,就一定是得到False
的答案的
那我們要怎麼判斷分不同的nan
呢?這個時候通常就會需要用到特殊的函數來判斷,例如np.isnan()
print(np.isnan(a))
print(np.isnan(b+1)) # nan進行計算仍然是nan
以上,因此之後如果遇到了缺失值的nan需要篩選和處理的時候,記得不要用錯方法哦~