在用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需要篩選和處理的時候,記得不要用錯方法哦~