如果你用過 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 三欄。資料的數值沒有被加總,改變的是排列方式,這就是「寬表轉長表」。把顏色對起來看會更清楚:

第五題: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 組操作讀熟
若想安排入門練習,可以先從以下操作開始。這是本文建議的閱讀順序,並非官方公布的題型比重。
groupby():依欄位分組,為後續計算準備資料。mean()、sum()、count():分辨平均、加總與非缺失值計數。isna():辨認缺失位置。fillna():以指定方式填補缺失值。dropna():依條件移除含缺失值的列或欄。loc[]:依標籤或條件選取資料。melt():把寬表轉為長表。corr():計算欄位間的相關係數。
練熟後,再補上 pivot_table()、astype() 和統計報表判讀。每次可以用幾筆假設資料,先在紙上推算結果,再執行程式核對。若結果不同,就回頭找出自己在哪一步誤解了欄位、條件或運算。
這樣練習的目的,是讓開頭那串看不懂的程式逐漸變成可追蹤的步驟:資料從哪裡來、經過什麼處理,最後留下什麼結果。
讀完試試看
下面這行執行後,df 會有什麼變化?
df.loc[df["sales"] > 200, "vip"] = True
想好再往下看。參考答案:銷售額大於 200 的列,vip 欄被設成 True。如果原本沒有 vip 欄,pandas 會新增這一欄,不符合條件的列則是缺失值。這行用等號寫回 df,所以原資料會被改寫。
本站整理的是自學理解方式,非 iPAS 官方試題或教材。正式評鑑範圍與最新考試規則,請以 AI 應用規劃師官方專區 公告為準。