[Pandas]計算空值NaN的出現次數, 判斷NaN值, isnull(), isna(), any(), values()用法教學

應用篇

這篇文章會說明如何判斷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值的數據做處理可以參考下面這篇文章。

留言