pandas 偵測 NaN:isnull、isna、isNaN 哪些有效?
參考下圖計算各變數的遺漏值(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 各欄的缺失值個數?
一句話總結
pandas 計算缺失值的有效語法是 isnull() 和 isna()(兩者完全等價)。isNaN()(大寫 N)和 isnan()(全小寫)都不是 pandas DataFrame 的方法,執行會拋出 AttributeError。正確選項是「選項 A(isnull)和 選項 C(isna)」,對應總選項 C。
先感受問題:四個長得像的方法,只有兩個真的存在
行銷資料分析師小嘉要計算各欄缺失值個數,她查了幾個看起來都合理的方法名稱:
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'。
逐一驗證四個語法是否存在
- 選項 A:df.isnull().sum() → 有效。isnull() 是 pandas DataFrame/Series 的標準方法,返回與原資料同形狀的布林矩陣(True 表示缺失)。.sum() 對每欄加總布林值,得到各欄缺失值個數。這是最早期使用的寫法。
- 選項 B:df.isNaN().sum() → 無效,報錯。pandas DataFrame 沒有 isNaN()(大寫 N)這個方法。大小寫不一致,AttributeError。注意:numpy 有 np.isnan(),但那是 numpy 的函式(接受 array),不是 pandas DataFrame 的方法,用法不同。
- 選項 C:df.isna().sum() → 有效。isna() 是 pandas 1.0 版後加入的別名,功能和 isnull() 完全相同,返回相同的結果。現代 pandas 官方文件推薦用 isna(),語義上更清晰("is not available")。
- 選項 D:df.isnan().sum() → 無效,報錯。pandas DataFrame 沒有 isnan()(全小寫 n)這個方法。同樣 AttributeError。全小寫的 isnan 是 Python math 模組的函式(math.isnan(x)),不是 pandas 方法。
- 總結:只有 A 和 C 有效,對應正確選項 C(「選項 A、選項 C」)。
isnull 和 isna 是同一件事,兩個都對
小嘉驗證後確認:
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 精讀
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像有一張大表格,每個格子不是有數字就是空白。「isnull」和「isna」是兩個印章,把空白格蓋上 True、有數字的蓋 False。再用 sum() 算每一欄有幾個 True,就知道每欄有幾個空白格。「isNaN」和「isnan」是兩個根本不存在的假印章,找不到就報錯了。
| 方法名稱 | 存在於 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() |
- 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(別名)
本題沒有數學公式,核心是 pandas API 的確切方法名稱:
- 有效的缺失值偵測:isnull()、isna()(互為別名)
- 無效(不存在):isNaN()、isnan()、isNan()
- numpy 的 np.isnan(x) 存在,但只接受純數值,不接受含 NaN 的 DataFrame(會報錯),不能直接替代 pandas 的 isna/isnull
- isnull() 和 isna() 有什麼差別?哪個是別名?
- df.isna().sum() 的結果和 df.isnull().sum() 是否完全相同?為什麼?
- 為什麼 isNaN() 和 isnan() 在 pandas 中不存在?它們在哪裡存在?
- 如果只想找出 facebook 欄有幾個缺失值,語法是什麼?
- 如何用 isna() 篩選出所有 facebook 欄不是缺失值的行?
為什麼其他總選項是錯的
字面在說什麼:只有 df.isnan().sum() 能計算缺失值。
為什麼不對:pandas DataFrame 沒有 isnan() 方法,執行會立刻拋出 AttributeError。全小寫的 isnan 不在 pandas 的 API 中。同時這個選項漏掉了 isnull 和 isna 兩個真正有效的方法。
誰會選錯:記得 numpy 有 np.isnan(),或 Python math 模組有 math.isnan(),誤以為 pandas 也有同名方法。
字面在說什麼:isNaN、isna、isnan 這三個都有效。
為什麼不對:isna() 有效,但 isNaN()(大寫 N)和 isnan()(全小寫)都不存在。這個選項包含了兩個不存在的方法,而且漏掉了 isnull()(有效的方法)。
誰會選錯:以為有效的方法是「帶 NaN 字樣的」,而沒有記住 pandas 的方法是 isnull 和 isna(不是 isNaN 或 isnan)。
字面在說什麼:isnull、isNaN、isna 三個都有效。
為什麼不對:isnull() 和 isna() 確實有效,但 isNaN()(大寫 N)不存在。如果把 B 也加進來,執行 df.isNaN().sum() 會報 AttributeError,不是正確答案。
誰會選錯:認為有效方法更多的人,沒有嚴格驗證 isNaN 大寫 N 是否真的存在於 pandas API。
同個考點下次怎麼變形
直覺:pandas 的缺失值除了 NaN,還有哪些形式?isna() 都能偵測到嗎?
答案:pandas 認識三種缺失值:numpy.nan(浮點數 NaN)、Python None(物件型別缺失值)、pandas.NA(新版 pandas 的可空型別缺失值)。isna() 和 isnull() 都能偵測到這三種,返回 True。有一個特例:numpy.nan == numpy.nan 是 False(NaN 的定義),所以用 == np.nan 來判斷缺失值是不正確的,必須用 isna()。
直覺:如果我想知道哪些列(行)有任何缺失值,語法是什麼?
答案:df.isna().any(axis=1),axis=1 表示對每行做「是否有任何 True」的判斷,返回一個 Series(True 表示該行至少有一個缺失值)。用來篩選有缺失值的行:df[df.isna().any(axis=1)]。相反地,df.isna().all(axis=1) 是「整行都是缺失值」。
直覺:填補缺失值的常見策略,分別用什麼語法實現?
答案:三種常見策略:(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')(後一個)。實務上選哪種填補策略需要根據資料的語意和後續分析目的決定。
直覺:機器學習模型(例如 sklearn)能直接接受有缺失值的資料嗎?
答案:大多數 sklearn 模型不能。大部分的 sklearn estimator(如 LinearRegression、RandomForest)在訓練時遇到 NaN 會直接拋出 ValueError:"Input contains NaN"。需要在模型訓練前先填補缺失值,通常用 sklearn.impute.SimpleImputer(支援均值、中位數、眾數、常數填補)或 IterativeImputer(用其他特徵預測缺失值,更精準)。部分模型(如 XGBoost、LightGBM)內建支援 NaN,但這是例外。
直覺:如何快速判斷哪些欄位的缺失值比例高,哪些可以忽略?
答案:計算缺失值比例:df.isna().mean()(每欄缺失比例 = 缺失值個數 / 總行數)。業界慣例:缺失值超過 50-60% 的欄位通常建議直接刪除(資訊太稀少);5-20% 的欄位視情況填補;低於 5% 的可以用簡單填補(均值/中位數)。df.isna().mean().sort_values(ascending=False) 讓缺失比例高的欄位排前面,方便優先處理。
想再往下看,這 5 個
- 資料填補(Data Imputation)isna() 找到缺失值後,下一步是決定用什麼策略填補,填補方法的選擇直接影響模型效果。
- 資料前處理(Data Preprocessing)偵測和處理缺失值是資料前處理流程的必要步驟,在任何分析或建模之前都必須完成。
- 資料品質監控(Data Quality Monitoring)定期計算各欄缺失值比例,是生產環境資料品質監控的基本指標之一。
- 線性迴歸(Linear Regression)sklearn 的 LinearRegression 不接受缺失值,必須先用 isna() 確認並填補後才能訓練,是迴歸建模前置步驟。
- 機器學習(Machine Learning)缺失值處理是 ML 工作流程的基礎環節,不同演算法對缺失值的容忍度不同,需要依模型選擇處理策略。