iPAS 備考專區 登入

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

pandas 讀 CSV 後 Year 欄位為什麼變成 float64?

原題

一間遊戲市場研究公司正在分析全球電子遊戲銷售情況,並準備建立一份「熱銷遊戲銷售報告」。分析師取得了一份名為 vgsales.csv 的資料集,內容包含全球銷量超過 10 萬份的電子遊戲清單。研究團隊希望透過這份資料,了解不同年份、平台與地區的銷售趨勢。 分析師在載入資料後,檢視 Year 欄位的資料型態,發現它是 float64,而非一般年份常用的整數。他想了解這樣的情形為什麼會發生。請問下列哪些原因可能導致這種狀況? 原因 A:CSV 檔中 Year 欄位有缺失值(NaN),導致 Pandas 自動將整欄轉為浮點數。 原因 B:CSV 檔中的年份資料原本是字串(如 "2006"),Pandas 轉換時出錯而變成浮點數。 原因 C:Pandas 預設會將所有數值型態讀取為 float64,不論資料是否為整數。 原因 D:CSV 檔中的年份資料可能包含小數點(例如 2006.0),因此被視為浮點數。

白話

分析師用 pandas 讀 vgsales.csv 後,發現 Year 欄位的資料型別(dtype)是 float64,不是預期的整數 int。題目把四個可能的成因(A 到 D)打包成四個組合選項,要你找出哪些原因確實可能造成這種情形。

問你:哪些原因真的可能導致 pandas 把 Year 欄位讀成 float64?

一句話總結

正確答案是 選項 B(原因 A 和原因 D):CSV 有缺失值(NaN)時 pandas 自動升成 float64,以及年份資料本身寫成小數點格式(2006.0)時也會讀成 float64。原因 B(字串轉錯)和原因 C(pandas 全預設 float64)都不符合 pandas 的實際行為。

情境

先感受問題:年份欄位明明是整數,為什麼被讀成小數?

遊戲研究公司的分析師小凱載入了 vgsales.csv,檢查資料型別:

data.dtypes 輸出:

Name object

Platform object

Year float64 ← 為什麼不是 int64?

Genre object

Global_Sales float64

Year 欄位只有年份(2006, 2010, 2014...),理論上應該是整數。小凱知道這背後有原因,需要找出是哪些情況造成的。

關鍵是理解 pandas 的類型推斷規則: - 整數欄位一旦混入 NaN,numpy 的 int64 無法表示 NaN,pandas 就自動把整欄升成 float64(因為 Python float 可以用 nan 表示缺失值)。 - CSV 中本身就寫 2006.0(帶小數點)時,pandas 自然讀成 float64。 這兩個原因(A 和 D)是真實成因;原因 B 和 C 是常見誤解。

舊方法

逐一拆解四個原因是否成立

  1. 原因 A:有缺失值(NaN)→ 成立。numpy 的 int64 本來就無法存放 NaN(NaN 是浮點數概念),所以當 pandas 讀到一欄整數資料但其中有缺失值時,它必須把整欄型別提升(upcast)成 float64,才能同時存放整數值和 NaN。這是 pandas 在 Int64(可空整數)推出之前的標準行為。
  2. 原因 B:字串自動轉錯 → 不成立。pandas 讀 CSV 時,如果一欄全是像 "2006" 這樣的數字字串,pd.read_csv 預設會自動嘗試轉型成整數或浮點數,不會因為「原本是字串」就「出錯變成浮點數」。字串純數字能轉換成功,通常會被讀成 int64,而不是 float64。這不是 pandas 的正常行為。
  3. 原因 C:pandas 預設全部讀成 float64 → 不成立。pandas 不會把所有數值都讀成 float64,它會根據內容推斷型別:純整數欄位會被推斷為 int64,有浮點數的欄位才是 float64。「預設全部 float64」這個說法不符合事實。
  4. 原因 D:CSV 本身寫 2006.0 → 成立。如果 CSV 中年份欄位的值是 2006.0(帶小數點),pandas 的類型推斷器看到小數點就會把它讀成 float64,這是完全合理的解析行為。Excel 或舊資料系統匯出的 CSV 有時會以這種格式儲存年份。

新方法

原因 A 和 D 成立,選組合包含且僅包含 A、D 的選項

小凱確認了:

原因 A:NaN 導致 upcast → 成立

原因 B:字串轉錯 → 不成立(pandas 不會這樣)

原因 C:全預設 float64 → 不成立(pandas 不會這樣)

原因 D:CSV 本身有 2006.0 → 成立

正確答案要包含 A 和 D,而且不包含 B 和 C。四個總選項中,「原因 A、原因 D」對應選項 B。這就是選項 B 講的:原因 A、原因 D。

錯選項

為什麼其他總選項是錯的

A原因 B、原因 C

字面在說什麼

字串轉換出錯和「pandas 全部讀成 float64」這兩個原因導致了 float64。

為什麼不對

原因 B 不成立:pandas 讀到純數字字串時不會「出錯變成浮點數」,它有自動型別推斷機制,會嘗試轉成整數或浮點數,但不是「出錯」。原因 C 不成立:pandas 不會把所有數值都讀成 float64,整數欄無缺失時會讀成 int64。

誰會選錯

對 pandas 的自動型別推斷機制不熟悉、誤以為「字串一定會造成問題」的人,或者誤記了「pandas 預設 float」這個說法的人。

C原因 A、原因 B、原因 D

字面在說什麼

NaN、字串轉換出錯、CSV 有小數點這三個原因都導致了 float64。

為什麼不對

原因 A 和 D 確實成立,但原因 B 不成立。pandas 讀純數字字串(如 "2006")時,是正常的型別轉換,不是「出錯」。如果 CSV 中 Year 欄有 "2006" 這樣的字串,pd.read_csv 會嘗試把它轉為整數 2006,不會無緣無故變成 float64。

誰會選錯

認為「字串也可能導致浮點數問題」的人,選了多一個不必要的原因。

D原因 C、原因 D

字面在說什麼

pandas 全部讀成 float64 和 CSV 本身有小數點,這兩個原因造成 float64。

為什麼不對

原因 D 成立,但原因 C 不成立。「pandas 預設將所有數值讀成 float64」是錯誤的說法,整數欄(無缺失值)會被讀成 int64,而且選項 D 包含 C 卻漏掉了 A(NaN 導致 upcast),答案不完整。

誰會選錯

只記得「看到 2006.0 就是 float」,但沒想到 NaN 也是重要原因的人。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

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

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

看官方原文 PDF

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