使用 Python 判斷與處理 NaN 的完整指南|處理浮點數缺失值的方法

1. 在 Python 中判斷 NaN 的方法

什麼是 NaN?

NaN(Not a Number)是一種特殊的浮點數值,用來表示無效或未定義的數學運算結果。典型的例子包括除以零或其他無效的運算。在進行資料分析或數值處理時,必須特別留意 NaN 的存在。如果未正確處理 NaN,可能導致計算結果不正確,甚至程式無法如預期執行。

為什麼 NaN 判斷很重要?

如果資料集中含有 NaN,可能會影響資料的可信度或最終的運算結果。因此,首先判斷是否存在 NaN,並根據需求進行後續處理(如刪除、替換等)是非常重要的步驟。

2. 如何在 Python 中產生 NaN

在 Python 中,可以使用 float('nan') 來產生 NaN。這常用於明確表示數值運算中的無效結果。

num = float('nan')
print(num)  # 結果: nan

與 None 的差異

NaN 表示數值上的無效,而 None 則表示「沒有任何值」的狀態。None 可以使用 == 來進行比較,但 NaN 即使與自身比較,也會回傳 False,因此使用 == 來判斷 NaN 是不正確的。

num = float('nan')
print(num == num)  # 結果: False

none_value = None
print(none_value == None)  # 結果: True

 

3. 判斷 NaN 的方法

3.1. 使用標準函式庫判斷(math.isnan()

若要使用 Python 的標準函式庫來判斷 NaN,可以使用 math.isnan()。此函式會在給定的值為 NaN 時回傳 True

import math

num = float('nan')
print(math.isnan(num))  # 結果: True

3.2. 使用 NumPy 判斷(numpy.isnan()

NumPy 是一個專門處理陣列與矩陣運算的函式庫,提供 numpy.isnan() 函式來高效判斷陣列中是否存在 NaN。在數值分析與科學資料處理中經常使用。

import numpy as np

num_list = [1, 2, np.nan, 4]
print(np.isnan(num_list))  # 結果: [False False  True False]

3.3. 使用 pandas 判斷(pandas.isna()

當處理資料框(DataFrame)時,可使用 pandas 的 isna()isnull() 來判斷是否有 NaN。這些函式在資料清理與處理缺失值時非常有用。

import pandas as pd
import numpy as np

data = pd.Series([1, 2, np.nan, 4])
print(pd.isna(data))  # 結果: 0    False
                      #      1    False
                      #      2     True
                      #      3    False

4. 刪除或替換 NaN 的方法

4.1. 從列表中刪除 NaN

若要從列表中刪除 NaN,可以結合 math.isnan() 與列表推導式來實現。

import math

num_list = [1, 2, float('nan'), 4]
clean_list = [num for num in num_list if not math.isnan(num)]
print(clean_list)  # 結果: [1, 2, 4]

4.2. 使用 pandas 刪除 NaN(dropna()

若要從 DataFrame 中刪除 NaN,可以使用 dropna() 方法。此方法會移除包含 NaN 的列或欄位。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
clean_df = df.dropna()
print(clean_df)

4.3. 使用 pandas 替換 NaN(fillna()

如果不想刪除 NaN,而是用特定的值來取代,可以使用 fillna() 方法。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
df.fillna(0, inplace=True)
print(df)

 

侍エンジニア塾

5. 含有 NaN 的計算

若計算中包含 NaN,則最終結果也會是 NaN。因此,若想獲得正確結果,必須事先移除或替換 NaN。

import numpy as np

result = 10 + np.nan
print(result)  # 結果: nan

包含 NaN 的統計計算範例

當對包含 NaN 的資料集進行統計運算時,若希望忽略 NaN 來進行計算,可以使用 NumPy 的 nanmean() 函式。此函式會排除 NaN 後計算平均值。

import numpy as np

data = [1, 2, np.nan, 4]
mean = np.nanmean(data)  # 忽略 NaN 進行平均值計算
print(mean)  # 結果: 2.3333...

6. 判斷 NaN 時的注意事項

6.1. 比較運算子的行為

NaN 有一個特殊性質:無論與其他數值或與自己比較,結果都會是不相等。因此,不能使用 ==!= 來判斷 NaN,必須使用專用的函式,如 isnan()isna()

num = float('nan')
print(num == num)  # 結果: False

6.2. 資料清理時的重點

在進行資料分析時,如果資料中殘留 NaN,將無法進行正確的計算。這可能會扭曲分析結果,因此在處理前必須進行妥善的清理。透過適當地移除或替換 NaN,可以提升資料的準確性與可信度。

年収訴求

7. 總結

在 Python 中,我們可以透過 mathnumpypandas 等工具,有效率地判斷與處理 NaN。了解如何正確處理 NaN,是進行資料分析與數值計算時不可或缺的基本知識,這項技能對各種程式開發領域都非常實用。