HOWTO · Python

在 Python 中檢查 NaN 值

學習如何在 Python 純量、列表、NumPy 陣列和 Pandas 資料中檢查 NaN 值,以及如何計算 Pandas 認定為遺漏的值的數量。

本頁內容

NaN 是「Not a Number」(非數值)的縮寫,是一種特殊的浮點值。檢查單一浮點數或由數值浮點數組成的清單時,請使用 math.isnan();檢查 NumPy 陣列時,請使用 numpy.isnan();檢查 Pandas 資料時,請使用 pandas.isna()。這些檢查會辨識 NaN 或由函式庫定義的缺失值;它們不會檢查資料庫中的 SQL NULL。

使用 math.isnan() 檢查數值與清單

Python 的 math.isnan() 遇到浮點數 NaN 時會傳回 True,遇到一般有限浮點數時則會傳回 False。若要檢查由數值浮點數組成的清單,可以使用串列推導式逐一檢查每個項目。此函式接受實數;字串和任意物件都不是數值輸入。

執行此範例:

import math

value = 3.5
print(math.isnan(value))
False

檢查清單時,對每個值使用相同的檢查方式:

import math

values = [1.0, float("nan"), 4.5]
checks = [math.isnan(value) for value in values]
print(checks)
[False, True, False]

單一數值的結果是 False,因為 3.5 不是 NaN。清單結果中間的 True 表示該值是 NaN。Python 會將布林值視為整數,因此可以使用 sum(checks) 計算 True 項目的數量。

使用 numpy.isnan() 檢查 NumPy 陣列

numpy.isnan() 會逐一檢查陣列元素,並傳回形狀相同的布林陣列。在程式碼中,常用別名 np 代表 NumPy,因此 np.isnan() 與 numpy.isnan() 是同一個函式。若要在陣列中放入 NaN 值,請使用 np.nan。

import numpy as np

data = np.array([1.0, np.nan, 4.0])
print(np.isnan(data))
[False  True False]

每個 True 都表示該元素是 NaN,每個 False 則表示該值不是 NaN。對多維陣列而言,布林結果會保留輸入陣列的形狀;可以使用這個遮罩選取符合條件的元素。

使用 pandas.isna() 檢查 Pandas 缺失值

Pandas 的 isna() 會傳回布林 Series 或 DataFrame,其索引和形狀與輸入資料相同。模組層級的 pandas.isna(),以及對應物件的方法(例如 df.isna()),都能找出 Pandas 判定為缺失的值。isnull() 是 Pandas 中功能相同的寫法。Pandas 的缺失值偵測適用於記憶體中的資料;它不會查詢資料庫中的 SQL NULL。

import pandas as pd

df = pd.DataFrame({"A": [1.0, float("nan")], "B": [float("nan"), 2.0]})
missing = pd.isna(df)
print(missing.sum())
A    1
B    1
dtype: int64

沿 DataFrame 預設的欄軸加總布林值,即可計算每個欄位的缺失值數量。在此範例中,A 和 B 欄各有一個 Pandas 判定為缺失的值。

使用 value != value 檢查 NaN

對一般的單一 NaN 浮點數而言,value != value 會得到 True,因為 NaN 不等於自身。這只是有限用途的替代方式,並非適用於所有 Python 資料型別的一般檢查方法:自訂物件可以自行定義比較行為,而類陣列值可能會傳回逐元素的結果。資料型別適用時,請優先使用 math.isnan()、numpy.isnan() 或 pandas.isna()。