這篇文章會說明如何判斷Dataframe, Series中有沒有NaN值的存在,以及如何計算NaN值出現的次數。主要會介紹以下幾點。
- 如何使用 isnull(), isna()
- 判斷各行列是否全部為NaN值
- 判斷各行列是否至少存在一個NaN值
- 計算各行列的NaN值
- 計算所有的NaN值有幾個
- 判斷整個Dataframe或是Series中是否存在NaN值
首先我們以下面的Dataframe為範例。
import pandas as pd
df = pd.read_excel('sample.xlsx')
df
利用isnull(), isna()判斷是否有NaN值
我們可以透過isnull()以及isna()來判斷Dataframe裡是否有NaN值,如果數據為NaN值的話會輸出True, 相反的如果不是NaN值就會出現False。
print(df.isnull())
# name age weight height other
#0 False False False False True
#1 False False False False True
#2 False False True False True
#3 False False False True True
#4 False True False False True
#5 False False False False True
print(df.isna())
# name age weight height other
#0 False False False False True
#1 False False False False True
#2 False False True False True
#3 False False False True True
#4 False True False False True
#5 False False False False True
isnull()及isna()在判斷Dataframe中是否有NaN值時的功能是相同的,所以這邊就看自己習慣使用哪個用法都可以。
在這邊補充說明其他的method:notnull(), notna()。這兩個功能就跟上述的isnull(), isna()相反,如果數據是NaN值時會顯示False,不是NaN值時則會顯示True。
print(df.notnull())
# name age weight height other
#0 True True True True False
#1 True True True True False
#2 True True False True False
#3 True True True False False
#4 True False True True False
#5 True True True True False
print(df.notna())
# name age weight height other
#0 True True True True False
#1 True True True True False
#2 True True False True False
#3 True True True False False
#4 True False True True False
#5 True True True True False
另外,可能會有人想透過python的==以及!=來判斷是否為NaN值,但要注意如果用==來判斷是否為NaN值則會得到全部都是False, !=則是會得到全部都是True。
print(df == float('nan'))
# name age weight height other
#0 False False False False False
#1 False False False False False
#2 False False False False False
#3 False False False False False
#4 False False False False False
#5 False False False False False
print(df != float('nan'))
# name age weight height other
#0 True True True True True
#1 True True True True True
#2 True True True True True
#3 True True True True True
#4 True True True True True
#5 True True True True True
判斷各行列數據是否全為NaN值
上面的方式再加上all()功能就可以判斷各行或列的數據是否全為NaN值,另外在all()中指定axis=1就是指定行的意思。
df.isnull().all()
#name False
#age False
#weight False
#height False
#other True
#dtype: bool
df.isunll().all(axis=1)
#0 False
#1 False
#2 False
#3 False
#4 False
#5 False
#dtype: bool
各行列是否至少有一個NaN值
相反地,我們可以透過any()來判斷各行列是否至少有一個NaN值。
df.isnull().any()
#name False
#age True
#weight True
#height True
#other True
#dtype: bool
df.isnull().any(axis=1)
#0 True
#1 True
#2 True
#3 True
#4 True
#5 True
#dtype: bool
由上面結果可以知道,如果至少有一個NaN值就會顯示True,如果都沒有NaN值就會是False。
計算各行各列的NaN值數量
isnull()配合sum()可以計算各行各列中NaN值的數量。
df.isnull().sum()
#name 0
#age 1
#weight 1
#height 1
#other 6
#dtype: int64
df.isnull().sum(axis=1)
#0 1
#1 1
#2 2
#3 2
#4 2
#5 1
#dtype: int64
count()
另外,count()則是計算不是NaN值的數量的方法。
df.count()
#name 6
#age 5
#weight 5
#height 5
#other 0
#dtype: int64
df.count(axis=1)
#0 4
#1 4
#2 3
#3 3
#4 3
#5 4
#dtype: int64
計算NaN值的總數
在Dataframe中,我們可以透過values來將Dataframe的檔案轉換成Numpy的ndarray。
df.isnull().values
這樣就可以利用ndarray的特性,利用sum()來計算裡面總共有幾個True。
df.isnull().values.sum()
#9
判斷Dataframe中是否至少含有一個NaN值
學會剛剛的values.sum()的用法之後,我們就可以利用python的!=功能來判斷是否有NaN值在Dataframe中
df.isnull().values.sum() != 0
# True
如果總數不是0的話就會出現True,也就是說至少有一個NaN值在Dataframe中。
最後,如果是想要針對NaN值的數據做處理可以參考下面這篇文章。
留言