iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 8

【Day08-比較】我們不一樣——在python中判斷相等的用法is, ==, 與如何判斷nan

在用numpypandas處理資料的時候
我們很常會遇到需要nan的情況
而最初在處理它的時候,就因為要判斷相等的方式用錯而繞了不少彎路


我當初就是這個表情

NaN

Nan(Not a Number的縮寫),在資訊科學中用來表示未定義的值
而在使用pandas讀取表格資料的時候,如果遇到了空的欄位也會被存儲成nan的形式

判斷相等的方法

is —— 判斷是否為同一個東西

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))

我們可以發現ac的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的答案的

isnan

那我們要怎麼判斷分不同的nan呢?這個時候通常就會需要用到特殊的函數來判斷,例如np.isnan()

print(np.isnan(a))
print(np.isnan(b+1)) # nan進行計算仍然是nan

以上,因此之後如果遇到了缺失值的nan需要篩選和處理的時候,記得不要用錯方法哦~


上一篇
【Day07-篩選】我全都要?啊還是挑一下吧——在python中如何篩選list, dict, pd.DataFrame
下一篇
【Day09-填空】漏漏缺缺欠欠填填刪刪補補——面對缺失值的處理方式
系列文
資料三十-那些最基本的資料處理與分析技能30

尚未有邦友留言

立即登入留言