HOWTO · Python
在 Python 中從列表中移除 NaN
本教程演示瞭如何從 Python 列表中刪除 NaN。
本頁內容
NaN 是一種特殊的浮點數值,常用來表示未定義或無法表示的數值結果。它與一般字串 'nan' 不同。若清單中是數值,請使用 Python 的 math.isnan();若處理數值陣列,NumPy 的 numpy.isnan() 很方便。要移除字面值 'nan',請直接比較字串。若混合資料同時包含數值 NaN 和字串 'nan',可將 pandas.isnull() 與字串比較搭配使用。
使用 math.isnan() 從 Python 清單中移除 NaN
Python 標準函式庫中的 math.isnan() 函式可辨識數值 NaN。它是函式,不是方法。NaN 不等於自身,因此像 x != x 這樣的檢查也能找出 NaN;不過,使用 math.isnan() 能更清楚表達意圖。若清單包含 math.isnan() 可接受的數值,便適合使用這種方式;它不能通用於任意字串或物件。繁體中文的 math.isnan() 參考頁目前沒有提供,以下連結仍指向英文參考頁:math.isnan() 參考資料。
以下完整範例會篩選數值清單,且不會修改原始清單:
import math
values = [1, 2, float("nan"), 4]
without_nan = [value for value in values if not math.isnan(value)]
print(without_nan)
[1, 2, 4]
使用 numpy.isnan() 從 Python 清單中移除 NaN
如果專案已使用 NumPy,可用 numpy.isnan() 對清單或陣列中的值逐一進行數值檢查。若尚未安裝,請執行 python -m pip install numpy。範例會先將輸入轉成陣列,再建立布林遮罩、選出不是 NaN 的值,最後將結果轉回 Python 清單。因此,最後得到的是清單,而不是 NumPy 陣列。
import numpy as np
values = [1, 2, np.nan, 4]
array = np.array(values)
without_nan = array[~np.isnan(array)].tolist()
print(without_nan)
[1.0, 2.0, 4.0]
從 Python 清單中移除字串 ’nan'
字串標記是一般文字,不是浮點數 NaN。如果資料已是字串清單,可直接逐項比較,移除完全符合小寫 'nan' 的值。這樣會保留其餘項目的型別與拼寫。若資料中的大小寫或空白格式不同,請相應調整比較條件。
values = ["1", "2", "nan", "8"]
without_string_nan = [value for value in values if value != "nan"]
print(without_string_nan)
['1', '2', '8']
如果先用 str() 將每個項目轉成字串,保留下來的數字也會變成字串。資料正規化時這可能有用,但會改變結果中的型別;若只是要移除清單裡已有的字串,並不需要這樣轉換。
使用 pandas.isnull() 從混合型 Python 清單中移除 NaN 和字串 ’nan'
處理混合清單時,可用 pandas.isnull() 找出數值 NaN 等缺失值,再將每個值與字面字串 'nan' 分開比較。pandas.isnull() 不會把文字 'nan' 視為缺失值。以下範例需要安裝 pandas(python -m pip install pandas),並會保留其他字串和數字原有的型別。pandas.isnull() 參考資料說明了缺失值檢查。
import pandas as pd
values = ["Ada", 23, "nan", "London", float("nan")]
without_missing_or_string_nan = [
value
for value in values
if not pd.isnull(value) and value != "nan"
]
print(without_missing_or_string_nan)
['Ada', 23, 'London']