iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目二 大數據處理分析與應用・114 年第二次・L22・第 44 題

Year 欄位含 NaN,怎麼安全轉換成整數?

原題

研究團隊接下來想要將 Year 欄位轉換為整數型態,以便後續進行年份趨勢分析。考慮到資料中可能包含缺失值(NaN),請選出最合適的轉換方式。

白話

vgsales.csv 的 Year 欄位目前是 float64,部分資料有缺失值(NaN)。研究團隊要把它轉成整數型態,方便做年份相關的趨勢分析。四個選項各提供了不同的轉換語法,有的在碰到 NaN 時會直接報錯,有的會用假值填補,有的能保留 NaN 同時轉成整數型別。

問你:在資料可能含有缺失值的情況下,哪一種轉換方式最合適?

一句話總結

含缺失值的欄位要轉整數,最合適的方式是 astype('Int64')(大寫 I):這是 pandas 的可空整數型別,可以同時存放整數值和 NaN,不需要先填補缺失值。直接 astype(int) 會報錯,fillna(0) 或 fillna(1) 用假值污染資料。

情境

先感受問題:轉型前要先處理 NaN 嗎?

遊戲研究公司的分析師小凱確認了 Year 欄有幾筆 NaN(某些遊戲沒有記錄發售年份)。他要把 Year 轉成整數以便按年份計算趨勢,但馬上發現問題:

方案一:直接 astype(int)

→ 執行後立刻報錯:Cannot convert non-finite values (NA or inf) to integer

方案二:fillna(0).astype(int)

→ 不報錯,但缺失年份被填成 0,分析時會出現「0 年」的假資料,污染趨勢圖

方案三:fillna(1).astype(int)

→ 同樣污染,缺失年份變成「西元 1 年」,更荒謬

方案四:astype('Int64')(大寫 I)

→ 成功轉換,dtype 變成 Int64,NaN 保留為 <NA>,不污染資料

正確答案是方案四:用 pandas 的可空整數型別 Int64,讓缺失值保持缺失,不用假值填補。

舊方法

三個錯誤做法各有什麼問題

  1. astype(int) 直接轉型:numpy 的 int 型別不支援 NaN,遇到缺失值就拋出 ValueError,整個轉換中斷。只有在確認資料完全沒有缺失值的情況下才能安全使用。
  2. fillna(0).astype(int) 填零再轉:技術上不報錯,但把缺失年份填成 0,年份分析時「西元 0 年」的資料就成了假資料。做趨勢圖時 x 軸會多一個 0,嚴重干擾視覺呈現和統計結果。
  3. fillna(1).astype(int) 填 1 再轉:和 fillna(0) 同樣的問題,只是假值換成 1,遊戲發售年份出現「西元 1 年」更不合邏輯,是語義上更嚴重的錯誤。
  4. 不處理 NaN 就分析:如果不轉型就直接做年份趨勢分析,float64 的年份計算可能出現 2006.0 這樣的小數年份,且 NaN 會在 groupby 等操作時被自動跳過,行為有時不符合預期。
  5. drop NaN 後再轉型:dropna() 後再 astype(int) 是另一種做法,但這會永久刪除有 NaN 的整筆資料,損失其他欄位的有效資訊。Int64 保留 NaN 是更好的選擇。

新方法

astype('Int64') 一行搞定:轉整數又保留缺失值

小凱最終採用:

data['Year'] = data['Year'].astype('Int64')

轉換後驗證:

data['Year'].dtype → Int64

data['Year'].isna().sum() → 同前(NaN 筆數不變)

data['Year'].head() → 2006, 1985, 2008, <NA>, 2010(有缺失的顯示 <NA>)

轉換後 dtype 顯示 Int64(大寫),缺失值以 pandas 的 <NA> 表示,不是 numpy 的 nan,且整欄都是整數值,可以直接做年份趨勢分析。這就是選項 D 講的:data['Year'] = data['Year'].astype('Int64')。

錯選項

為什麼其他選項是錯的

Aastype(int)

字面在說什麼

直接把 Year 欄轉成整數型態。

為什麼不對

numpy int(即 int64)不支援 NaN 值。Year 欄有缺失值,執行 astype(int) 時會拋出 ValueError:"Cannot convert non-finite values (NA or inf) to integer"。程式會在這行中斷,無法繼續執行。

誰會選錯

只知道「轉整數用 astype(int)」但不知道 int 無法存 NaN 的人,或者沒有仔細看題目說「考慮到可能包含缺失值」這個提示的人。

Bfillna(0).astype(int)

字面在說什麼

先把缺失值填成 0,再轉整數,兼顧了 NaN 問題和型別轉換。

為什麼不對

技術上不報錯,但語意上錯了。把缺失的年份填成 0(西元 0 年)是無意義的假資料。後續做年份趨勢分析時,x 軸出現「Year = 0」,嚴重影響視覺化和統計正確性。題目說「最合適」,語意上正確才算合適。

誰會選錯

只想解決「不能有 NaN」的問題,沒有考慮填入假值對後續分析的影響。看到「不報錯」就認為是正確答案的人。

Cfillna(1).astype(int)

字面在說什麼

先把缺失值填成 1,再轉整數,這樣 NaN 問題和型別轉換都解決了。

為什麼不對

和選項 B 同樣的問題,只是假值更荒謬。把遊戲缺失的發售年份填成 1(西元 1 年),比填 0 更明顯是錯誤的,任何人看到 Year = 1 都知道是假資料。fillna 填入的值必須要有語意合理性,1 對年份分析沒有任何意義。

誰會選錯

同選 B 的人,但選了更荒謬的填補值。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

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

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。