HOWTO · Pandas

如何在 Pandas DataFrame 的列中將所有 NaN 值替換為零

在 Pandas 庫中使用 df.fillna(),df.replace()方法在 DataFrame 中將 NaN 值替換為零

本頁內容

若要替換 pandas DataFrame 單一欄位中的缺失值,請先選取該欄位,呼叫 fillna(0),再將回傳的 Series 指派回同一欄位:df["A"] = df["A"].fillna(0)。這只會修改欄位 A,其他欄位的值維持不變。df.fillna() 也能填補整個 DataFrame 中的缺失值,因此若只要處理一個欄位,先選取 Series 很重要。另一種做法是使用 df.replace(),在選取的 Series 中比對特定值並加以替換。

使用 fillna() 替換單一欄位中的 NaN 值

fillna() 會將 pandas 識別為缺失值的項目替換成你指定的值。在此範例中,建立 DataFrame 時,數值欄位中的 None 會被表示為缺失值。將 fillna(0) 的結果指派回 df["A"],替換才會反映在 df 中;若呼叫後沒有指派結果,DataFrame 變數就不會因此改變。第二個欄位可供對照,其中的缺失值會保留下來。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, None, 4],
    "B": [None, 2, 3, 4],
})

df["A"] = df["A"].fillna(0)
print(df.to_string())
     A    B
0  1.0  NaN
1  2.0  2.0
2  0.0  3.0
3  4.0  4.0

輸出顯示,欄位 A 中的缺失值已變成 0.0,而欄位 B 中的缺失值仍是 NaN。你可以對自己的 DataFrame 和目標欄位套用相同的指派方式。fillna() 也接受其他替代值,並支援向前或向後填補等策略;只有在這些策略符合資料的意義與順序時才使用。若直接對 DataFrame 呼叫 df.fillna(0),就會填補各欄位中的缺失值,而不只欄位 A。

使用 replace() 替換單一欄位中的 NaN 值

若要替換某個特定值或一組值,也可以使用 replace()。若要在 Series 中指定缺失值,可使用 df["A"].replace(float("nan"), 0),並將回傳的 Series 指派回 df["A"]。這種寫法會明確提供 NaN 值;不要假設 replace() 一定會將 None 視為 NaN。和 fillna() 一樣,對選取的 Series 呼叫此方法,操作範圍就會限於該欄位。若對整個 DataFrame 呼叫 df.replace(...),多個欄位中符合條件的值都可能受到影響。

對這項工作而言,fillna() 更直接地表達了填補缺失值的意圖。若需要利用 replace() 的值比對行為,例如同時將選取欄位中的已知佔位值標準化,就可以使用它。若後續程式碼要使用修改後的資料,兩種方法都應將回傳結果指派回去;這種寫法不需要 inplace=True。

選擇符合資料特性的替代值

只有當零能代表分析中缺失觀測值的意義時,才適合用零替換。例如,若缺少的計數代表沒有事件發生,零可能合適;但若缺失代表「未知」,用零可能扭曲測量結果。視欄位內容與分析目的而定,其他固定值、符合領域需求的值,或平均數、中位數等統計量可能更合適。填補之前,先決定缺失值代表什麼;替換缺失值會抹去「沒有觀測值」與「實際值為零」之間的差異。

替代值也必須符合欄位的資料型別。數值零適用於數值欄位;若在文字欄位中填入零,可能會改變 pandas 表示或處理資料的方式。如果後續計算仰賴數值型別,請檢查結果的 dtype。此處的範例只填補選取的欄位,能在你判斷替代值時避免改動不相關的資料。

檢查結果

檢視目標欄位 df["A"],或顯示整個 DataFrame,確認預期的值已變更。若要計算該欄位中仍存在多少缺失值,請使用 df["A"].isna().sum();結果為零代表該 Series 中已沒有 pandas 識別的缺失值。這項檢查無法判斷零是否符合分析需求,因此也要確認替代值是否符合資料的意義。如果計數不為零,請確認選取的是預期欄位,並已將方法回傳的 Series 指派回該欄位。