iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用

pandas 偵測 NaN:isnull、isna、isNaN 哪些有效?

原題 49

參考下圖計算各變數的遺漏值(NaN)個數結果,下列何者正確? (輸出結果:youtube 0 / facebook 1 / newspaper 0 / sales 0 / dtype: int64) 選項 A: df.isnull().sum() 選項 B: df.isNaN().sum() 選項 C: df.isna().sum() 選項 D: df.isnan().sum()

白話

題目顯示計算各欄缺失值個數的輸出結果(facebook 有 1 個 NaN),並列出 4 個 pandas 的方法語法(A 到 D),題目把它們打包成 4 個組合選項,要你從中找出哪些語法能正確得到這個輸出。

問你:哪些語法能正確計算 DataFrame 各欄的缺失值個數?

點選你的答案。

01 總結

一句話總結

pandas 計算缺失值的有效語法是 isnull() 和 isna()(兩者完全等價)。isNaN()(大寫 N)和 isnan()(全小寫)都不是 pandas DataFrame 的方法,執行會拋出 AttributeError。正確選項是「選項 A(isnull)和 選項 C(isna)」,對應總選項 C。

02 情境

先感受問題:四個長得像的方法,只有兩個真的存在

行銷資料分析師小嘉要計算各欄缺失值個數,她查了幾個看起來都合理的方法名稱:

df.isnull().sum() → 能用?
df.isNaN().sum() → 能用?(注意 N 大寫)
df.isna().sum() → 能用?
df.isnan().sum() → 能用?(全小寫)

關鍵是 pandas DataFrame 的 API 只定義了 isnull() 和 isna() 兩個方法,而且兩者是完全等價的別名(alias)。isNaN() 和 isnan() 根本不是 pandas 的方法,執行時會拋出 AttributeError:'DataFrame' object has no attribute 'isNaN'。

03 對照

逐一驗證四個語法是否存在

  1. 選項 A:df.isnull().sum() → 有效。isnull() 是 pandas DataFrame/Series 的標準方法,返回與原資料同形狀的布林矩陣(True 表示缺失)。.sum() 對每欄加總布林值,得到各欄缺失值個數。這是最早期使用的寫法。
  2. 選項 B:df.isNaN().sum() → 無效,報錯。pandas DataFrame 沒有 isNaN()(大寫 N)這個方法。大小寫不一致,AttributeError。注意:numpy 有 np.isnan(),但那是 numpy 的函式(接受 array),不是 pandas DataFrame 的方法,用法不同。
  3. 選項 C:df.isna().sum() → 有效。isna() 是 pandas 1.0 版後加入的別名,功能和 isnull() 完全相同,返回相同的結果。現代 pandas 官方文件推薦用 isna(),語義上更清晰("is not available")。
  4. 選項 D:df.isnan().sum() → 無效,報錯。pandas DataFrame 沒有 isnan()(全小寫 n)這個方法。同樣 AttributeError。全小寫的 isnan 是 Python math 模組的函式(math.isnan(x)),不是 pandas 方法。
  5. 總結:只有 A 和 C 有效,對應正確選項 C(「選項 A、選項 C」)。
04 解法

isnull 和 isna 是同一件事,兩個都對

小嘉驗證後確認:

df.isnull().sum() → 輸出:youtube 0, facebook 1, newspaper 0, sales 0 ✓
df.isna().sum() → 輸出:youtube 0, facebook 1, newspaper 0, sales 0 ✓(完全一樣)
df.isNaN().sum() → AttributeError: 'DataFrame' has no attribute 'isNaN' ✗
df.isnan().sum() → AttributeError: 'DataFrame' has no attribute 'isnan' ✗

A 和 C 都能產生題目顯示的輸出,B 和 D 直接報錯。正確的組合是「選項 A 和 選項 C」。這就是總選項 C 講的:選項 A、選項 C

技術版:pandas 缺失值偵測 API 精讀

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

Step 1 純故事版

想像有一張大表格,每個格子不是有數字就是空白。「isnull」和「isna」是兩個印章,把空白格蓋上 True、有數字的蓋 False。再用 sum() 算每一欄有幾個 True,就知道每欄有幾個空白格。「isNaN」和「isnan」是兩個根本不存在的假印章,找不到就報錯了。

Step 2 中文 ↔ 程式碼對照
方法名稱存在於 pandas?
df.isnull()✓ 存在,是最早的寫法
df.isna()✓ 存在,pandas 1.0 後的別名,與 isnull 完全等價
df.isNaN()✗ 不存在,大寫 N 導致 AttributeError
df.isnan()✗ 不存在,AttributeError(math.isnan 是 Python 內建,不是 pandas 方法)
計算每欄缺失值個數df.isnull().sum() 或 df.isna().sum()
Step 3 符號角色表
isnull() / isna()
pandas DataFrame 和 Series 的缺失值偵測方法,返回同形狀的布林 DataFrame/Series,True 代表缺失值(NaN、None、pd.NA)。
.sum()
對布林值加總(True=1, False=0),得到每欄缺失值的個數。預設 axis=0(對每欄做加總)。
notnull() / notna()
isnull/isna 的相反,True 代表非缺失值,常用在篩選有效行:df[df['col'].notna()]。
alias(別名)
isnull 和 isna 互為別名,在 pandas 原始碼中 isna = isnull(完全相同的函式),選哪個都可以。
Step 4 完整公式對應

本題沒有數學公式,核心是 pandas API 的確切方法名稱:

  • 有效的缺失值偵測:isnull()、isna()(互為別名)
  • 無效(不存在):isNaN()、isnan()、isNan()
  • numpy 的 np.isnan(x) 存在,但只接受純數值,不接受含 NaN 的 DataFrame(會報錯),不能直接替代 pandas 的 isna/isnull
Step 5 自我複述
  1. isnull() 和 isna() 有什麼差別?哪個是別名?
  2. df.isna().sum() 的結果和 df.isnull().sum() 是否完全相同?為什麼?
  3. 為什麼 isNaN() 和 isnan() 在 pandas 中不存在?它們在哪裡存在?
  4. 如果只想找出 facebook 欄有幾個缺失值,語法是什麼?
  5. 如何用 isna() 篩選出所有 facebook 欄不是缺失值的行?
05 陷阱

為什麼其他總選項是錯的

總選項 A 只有選項 D(isnan)

字面在說什麼:只有 df.isnan().sum() 能計算缺失值。

為什麼不對:pandas DataFrame 沒有 isnan() 方法,執行會立刻拋出 AttributeError。全小寫的 isnan 不在 pandas 的 API 中。同時這個選項漏掉了 isnull 和 isna 兩個真正有效的方法。

誰會選錯:記得 numpy 有 np.isnan(),或 Python math 模組有 math.isnan(),誤以為 pandas 也有同名方法。

總選項 B 選項 B、C、D(isNaN、isna、isnan)

字面在說什麼:isNaN、isna、isnan 這三個都有效。

為什麼不對:isna() 有效,但 isNaN()(大寫 N)和 isnan()(全小寫)都不存在。這個選項包含了兩個不存在的方法,而且漏掉了 isnull()(有效的方法)。

誰會選錯:以為有效的方法是「帶 NaN 字樣的」,而沒有記住 pandas 的方法是 isnull 和 isna(不是 isNaN 或 isnan)。

總選項 D 選項 A、B、C(isnull、isNaN、isna)

字面在說什麼:isnull、isNaN、isna 三個都有效。

為什麼不對:isnull() 和 isna() 確實有效,但 isNaN()(大寫 N)不存在。如果把 B 也加進來,執行 df.isNaN().sum() 會報 AttributeError,不是正確答案。

誰會選錯:認為有效方法更多的人,沒有嚴格驗證 isNaN 大寫 N 是否真的存在於 pandas API。

06 變形

同個考點下次怎麼變形

變形 1 邊界

直覺:pandas 的缺失值除了 NaN,還有哪些形式?isna() 都能偵測到嗎?

答案:pandas 認識三種缺失值:numpy.nan(浮點數 NaN)、Python None(物件型別缺失值)、pandas.NA(新版 pandas 的可空型別缺失值)。isna() 和 isnull() 都能偵測到這三種,返回 True。有一個特例:numpy.nan == numpy.nan 是 False(NaN 的定義),所以用 == np.nan 來判斷缺失值是不正確的,必須用 isna()。

變形 2 反例

直覺:如果我想知道哪些列(行)有任何缺失值,語法是什麼?

答案:df.isna().any(axis=1),axis=1 表示對每行做「是否有任何 True」的判斷,返回一個 Series(True 表示該行至少有一個缺失值)。用來篩選有缺失值的行:df[df.isna().any(axis=1)]。相反地,df.isna().all(axis=1) 是「整行都是缺失值」。

變形 3 升級版

直覺:填補缺失值的常見策略,分別用什麼語法實現?

答案:三種常見策略:(1) 固定值:df.fillna(0);(2) 統計填補:df['col'].fillna(df['col'].mean())(均值)或 df['col'].fillna(df['col'].median())(中位數);(3) 前/後填補(時間序列常用):df.fillna(method='ffill')(用前一個有效值填補)或 df.fillna(method='bfill')(後一個)。實務上選哪種填補策略需要根據資料的語意和後續分析目的決定。

變形 4 跨領域

直覺:機器學習模型(例如 sklearn)能直接接受有缺失值的資料嗎?

答案:大多數 sklearn 模型不能。大部分的 sklearn estimator(如 LinearRegression、RandomForest)在訓練時遇到 NaN 會直接拋出 ValueError:"Input contains NaN"。需要在模型訓練前先填補缺失值,通常用 sklearn.impute.SimpleImputer(支援均值、中位數、眾數、常數填補)或 IterativeImputer(用其他特徵預測缺失值,更精準)。部分模型(如 XGBoost、LightGBM)內建支援 NaN,但這是例外。

變形 5 評估指標

直覺:如何快速判斷哪些欄位的缺失值比例高,哪些可以忽略?

答案:計算缺失值比例:df.isna().mean()(每欄缺失比例 = 缺失值個數 / 總行數)。業界慣例:缺失值超過 50-60% 的欄位通常建議直接刪除(資訊太稀少);5-20% 的欄位視情況填補;低於 5% 的可以用簡單填補(均值/中位數)。df.isna().mean().sort_values(ascending=False) 讓缺失比例高的欄位排前面,方便優先處理。

07 延伸

想再往下看,這 5 個

出處

iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用 第 49 題

查看官方原文 PDF