iPAS自學路
中級科目二最後更新

iPAS 中級 Python 題看不懂?先把程式碼當成一句中文讀

用假設資料逐步讀懂 groupby、isna、loc、melt 與 OLS 報表,分辨程式處理的對象、條件和結果,再檢查前處理是否使用了測試資料。

先用一個例子:把銷售資料整理成一列一個地區

假設一份報表記錄了 2025 年北美、歐洲、日本的銷售量,3 個地區各占一欄。後續若想依地區篩選或分組,可以先把地區名稱整理到同一欄,讓每列記錄一個地區。下圖用中文欄名示範這個過程;文章第 4 題再對照實際的 melt() 程式。

同一份銷售資料,換個排列方式melt() 圖解
把北美、歐洲、日本的銷售量整理成一列一個地區2025 年的北美、歐洲、日本銷售量分別為 10、8、6。原本各地區各占一欄,轉換後每個地區各成一列,年份都是 2025。圖中以中文代稱文章中的英文欄名。年份北美歐洲日本年份地區銷售量202520252025北美歐洲日本1086
年份不變各地區的銷售量不變

現在每列記錄一個地區。例如第一列是「2025 年、北美、10」。地區名稱集中在同一欄,方便後續篩選或分組;銷售量沒有加總。

教學用假設銷售量。圖中以中文代稱英文欄名;melt() 本身不會翻譯名稱。

如果你用過 Excel 的篩選、樞紐分析表,其實已經會一半了。Python 題裡最常見的 pandas 操作,很多就是把你在 Excel 裡用滑鼠點的動作,改用一行程式寫出來。差別在於程式不用一步步點,可以重複執行,也處理得了幾百萬列的資料。

所以這篇讀每一段程式時,都先問同一個問題:如果在 Excel 裡做,這是哪個動作?做完之後,資料表變成什麼樣子?

如果一長串程式看不出是哪個 Excel 動作,或 Excel 根本沒有對應的功能,我會再把它拆成四件事:這段程式處理的是哪份資料(對象)、做了什麼(動作)、只針對哪些資料(條件),最後產生什麼(結果)?

例如一張訂單表,題目可能要求按地區計算平均銷售額,也可能只挑出符合條件的資料。先認清這個目的,再沿著程式往下讀,就能把函式和它的作用連起來。

下面用自編的假設資料示範 5 種判讀情境,順序跟著資料處理的流程走:先計算與檢查(groupby、isna),再選取與修改(loc),接著改變表格形狀(melt),最後讀分析結果(OLS 報表)。程式中的 df 代表 pandas 資料表;這些例子用來練習理解,不代表官方題目的出題頻率。

第一題:groupby 是「先分堆,再計算」

假設一張訂單表中,每列是一筆訂單,region 記錄地區,sales 記錄該筆訂單的銷售額。想知道各地區的平均訂單銷售額,可以看這段:

df.groupby("region")["sales"].mean()

在 Excel 裡,這件事就是樞紐分析表:把「地區」拖到列、把「銷售額」拖到值,再把值的計算方式改成平均。

程式從 df 開始,groupby("region") 把同地區的資料歸成一組,["sales"] 指定要計算的欄位,mean() 再分別計算各組平均值。這幾步接起來,就是「依地區分組,計算每區平均銷售額」。

假設北區有兩筆訂單,金額是 100 和 300。先別往下看,北區的結果是多少?

答案是 200。這也能幫你分辨選項:400 是總額,2 是筆數,都不是這段程式要算的平均值。

第二題:isna().sum() 計算每欄的缺失值

資料分析前,通常要先知道哪些欄位缺資料。以下程式會先標記缺失的位置,再按欄計數:

df.isna().sum()

isna() 會把每個儲存格轉成 True 或 False:pandas 辨認為缺失值的地方是 True,其餘是 False。接著 sum() 預設沿著每一欄加總,把 True 算作 1,所以結果是各欄的缺失值數量。

假設 age 欄的 3 筆資料是 20、缺失值、30,這一欄的結果就是 1。這段程式只做檢查,不會填補或移除資料。

用 Excel 的經驗來想,這很像對每一欄用 COUNTBLANK 數空格。但這裡正好是 Excel 經驗不管用的地方:這裡的「缺失值」不能直接理解成畫面上的空格。像 None、NaN 會被辨認為缺失值,但空字串 "" 本身不算。實際資料如何讀入、是否已轉成缺失值,會影響結果;可對照 pandas 的 isna 說明。

第三題:loc 先選取資料,再指定要改的欄位

假設資料表有年齡欄 age,以及分類欄 group。下面這段程式要替符合年齡條件的人更新分類:

df.loc[df["age"] >= 65, "group"] = "senior"

在 Excel 裡,你會先用篩選挑出年齡大於或等於 65 的列,再把這些列的 group 欄一起改成 senior。loc 把「篩選」和「改哪一欄」寫在同一個中括號裡。

loc 中逗號前面的 df["age"] >= 65 決定要選哪些列;逗號後面的 "group" 決定要操作哪一欄。最後的等號才把這些位置設成 "senior"。

因此,它的意思是「把年齡大於或等於 65 的資料列,其 group 欄改成 senior」。65 是年齡門檻,並非第 65 列;不符合條件的列也不會跟著修改。讀到這裡,就能排除「整欄全部改掉」或「刪除 age 欄」這類不符合操作的說法。

第四題:melt 是把寬表拉長

第一題的 groupby 像樞紐分析表,把很多列的資料摺成一張摘要;melt 剛好反過來,把攤開的寬表拉回一列一筆。在 Excel 的 Power Query 裡,這個動作叫做「取消樞紐」(英文介面是 Unpivot)。

有些報表把不同地區各放一欄,方便橫向閱讀;但後續若要依地區分組或繪圖,會希望地區名稱集中在同一欄。假設原始資料如下,數字是教學用的銷售量:

Year NA_Sales EU_Sales JP_Sales
2025 10 8 6

以下程式使用 melt() 改變表格形狀:

df.melt(
    id_vars="Year",
    value_vars=["NA_Sales", "EU_Sales", "JP_Sales"],
    var_name="Region",
    value_name="Sales"
)

id_vars="Year" 表示保留年份作為識別欄;value_vars 指定要轉換的 3 個銷售欄。原本的欄位名稱會放進新的 Region 欄,對應數值則放進 Sales 欄:

Year Region Sales
2025 NA_Sales 10
2025 EU_Sales 8
2025 JP_Sales 6

轉換後,原本橫向排列的 3 個地區變成 3 列,每列都保留 2025 這個年份。因此結果共有 Year、Region、Sales 三欄。資料的數值沒有被加總,改變的是排列方式,這就是「寬表轉長表」。把顏色對起來看會更清楚:

melt 前後對照。上方寬表有 Year、NA_Sales、EU_Sales、JP_Sales 四欄,數值 2025、10、8、6;三個銷售欄各有一種顏色。箭頭標示 melt() 後,下方長表有 Year、Region、Sales 三欄共三列,Region 欄依序是 NA_Sales、EU_Sales、JP_Sales,Sales 欄是 10、8、6,顏色與原本的欄位對應

第五題:OLS 報表要分開看方向與顯著性

假設用一般最小平方法(OLS)建立銷售量模型,以每件交易金額 price 和廣告支出 ad_spend 作為解釋變數,得到下列示意報表:

price      coef = -0.30, P>|t| = 0.02
ad_spend   coef =  0.05, P>|t| = 0.18

先看 coef,它是模型估計的係數。在其他解釋變數固定的條件下,price 增加 1 單位,模型估計的銷售量平均減少 0.30 單位;負號描述的是這個模型中的關聯方向,不能單憑它認定漲價一定造成銷售量下降。

再看 P>|t|,它對應係數 t 檢定的雙尾 p 值,通常是在檢定該係數是否為 0。若題目指定顯著水準為 0.05,price 的 0.02 小於門檻,可說在檢定假設成立下,其係數達統計顯著;ad_spend 的 0.18 則未達門檻。

所以這份報表支持的說法是:「在這個模型中,price 的估計係數為負,且達指定的顯著水準。」p 值不代表模型正確率,而未達顯著也不等於證明完全沒有關聯。欄位定義可對照 statsmodels 的 pvalues 說明。

把五題放在一起比較

五題各自看都不難,放在一起時,最容易混淆的是「算出一份結果」和「改寫原本的資料」:

程式 產生的結果 改到 df 嗎?
groupby() 各地區的平均銷售額 沒有
isna() 各欄的缺失值數量 沒有
loc[] = 符合條件的 group 欄被改寫 有
melt() 寬表轉成長表的新表 沒有
OLS 報表 係數方向與 p 值 不是資料操作

只有 loc 那一行用等號把值寫回 df,其他幾行都是產生一份新結果。題目若問「執行後 df 變成什麼」,先找有沒有寫回原資料的動作;後面 dropna() 的例子也是同樣的道理。

讀懂單一函式後,還要檢查整個流程

同一段程式放在不同步驟,可能產生不同問題。假設 scaler 是標準化工具:

scaler.fit_transform(df[["income"]])

fit 先從資料估計標準化所需的參數,transform 再依這些參數轉換數值。如果 df 包含之後要留作測試的資料,卻在切分前就執行這一行,測試資料便提前影響了前處理。語法可以正常執行,評估流程卻可能發生資料洩漏。

讀題時要接著確認:這一步用了哪份資料、是否學習了參數,以及學習當下是否已把評估資料隔開。想看完整例子,可接著讀資料洩漏與前處理順序。

我會怎麼練 Python 題

拿到一段程式,我會依序寫下處理對象、動作、條件與結果。這份紀錄可以很短,但要讓自己看得出資料怎麼改變。例如:

df.dropna(subset=["customer_id"])

這段從 df 開始,只檢查 customer_id 欄,回傳移除該欄缺失列後的資料表。其他欄位即使有缺失,只要 customer_id 有值,就不會因這個條件被移除。

還要留意,這裡沒有把結果指定回 df,也沒有設定 inplace=True,所以原本的 df 不會被這一行直接改寫。這個差別可在 pandas 的 dropna 說明中核對。練習時若能說清楚「回傳了什麼」和「原資料是否改變」,理解就比只背函式名稱更完整。

先把這 8 組操作讀熟

若想安排入門練習,可以先從以下操作開始。這是本文建議的閱讀順序,並非官方公布的題型比重。

  1. groupby():依欄位分組,為後續計算準備資料。
  2. mean()、sum()、count():分辨平均、加總與非缺失值計數。
  3. isna():辨認缺失位置。
  4. fillna():以指定方式填補缺失值。
  5. dropna():依條件移除含缺失值的列或欄。
  6. loc[]:依標籤或條件選取資料。
  7. melt():把寬表轉為長表。
  8. corr():計算欄位間的相關係數。

練熟後,再補上 pivot_table()、astype() 和統計報表判讀。每次可以用幾筆假設資料,先在紙上推算結果,再執行程式核對。若結果不同,就回頭找出自己在哪一步誤解了欄位、條件或運算。

這樣練習的目的,是讓開頭那串看不懂的程式逐漸變成可追蹤的步驟:資料從哪裡來、經過什麼處理,最後留下什麼結果。

讀完試試看

下面這行執行後,df 會有什麼變化?

df.loc[df["sales"] > 200, "vip"] = True

想好再往下看。參考答案:銷售額大於 200 的列,vip 欄被設成 True。如果原本沒有 vip 欄,pandas 會新增這一欄,不符合條件的列則是缺失值。這行用等號寫回 df,所以原資料會被改寫。

本站整理的是自學理解方式,非 iPAS 官方試題或教材。正式評鑑範圍與最新考試規則,請以 AI 應用規劃師官方專區 公告為準。

大數據處理分析與應用

同樣是中級科目二的文章

看全部中級科目二的文章

回文章列表