TQC+ 網頁資料擷取與分析_Python_303_果菜批發市場拍賣行情 [改版緊急更新]

為什麼我的 Pandas 邏輯正確,CodeJudger 卻不給分?

最近有許多讀者反應,照著之前的範例碼在 CodeJudger 執行卻無法拿到滿分。

經過研究,發現是因為 CodeJudger 的 Pandas 環境升級 以及 測資判定變嚴格 了!

為了避免大家在考場上失分,我整理了這次改版後的三個「奪分關鍵」:

💡 改版關鍵 1:穩定排序 (Stable Sort)

題目有一行小小的提示:「若排序數值相同時,請依照資料出現先後順序進行排序」
在舊版本中,直接用 sort_values 可能會過,但新版測資中一定有兩個市場的「西瓜價」是一樣的。

  • 必過寫法: 必須加入 kind='mergesort' (或 kind='stable')。這能確保數值相同時,原始的市場順序(如台中、鳳山)不會被對調。

💡 改版關鍵 2:語法廢棄 (Deprecation)

新版 Pandas 已經正式移除了舊有的 ix 語法。

  • 必過寫法: 選取「台北一」市場行情時,請統一使用 df.loc["台北一"]

💡 改版關鍵 3:填空邏輯 (Attribute Assignment)

雖然 df.rename() 很方便,但這題的填空設計是要求你修改原始的變數(List),再指派回去給 DataFrame。

  • 必過寫法: 修改 indexscolumns 串列後,使用 df.index = indexs 的方式覆蓋。
1. 題目說明:

請開啟PYD03.py檔案,依下列題意進行作答,使輸出值符合題意要求。作答完成請另存新檔為PYA03.py再進行評分。

2. 設計說明:
  1. 某日各果菜批發市場之西瓜與香瓜之拍賣行情價量表如下:
 西瓜價西瓜量香瓜價香瓜量
三重區920367413.218894
台中市11.718078512.354894
台北一10.112780214.718563
台北二11.82860414.921963
台東市13.260013.1900
板橋區6.9380719.63555
高雄市12.13566010.69005
嘉義市12150001312000
鳳山區11.7487709.114370
豐原區9.84610011.898980

2.上述的資料已在PYD03.py中,請撰寫一程式建立資料結構,其中直行標題為項目(西瓜價、西瓜量、香瓜價、香瓜價),橫列標題為交易市場;接著完成下列項目:
a. 輸出如拍賣行情價量表
b. 以西瓜價遞減排序後,輸出各市場的西瓜價
c. 計算台北一市場西瓜/香瓜價量的行情並輸出
d. 將「三重市」改為「三重區」、「香瓜價」改為「洋香瓜價」、「香瓜量」改為「洋香瓜量」,重新輸出整個表格

提示:若排序數值相同時,請依照資料出現先後順序進行排序。
3. 輸入輸出:

輸入說明

輸出說明

分別輸出下列4段資料:
a. 拍賣行情價量表
b. 以西瓜價遞減排序後,各市場的西瓜價
c. 台北一市場西瓜/香瓜價量的行情
d. 將「三重市」改為「三重區」、「香瓜價」改為「洋香瓜價」、「香瓜量」改為「洋香瓜量」,重新輸出整個表格


範例輸入

範例輸出

題目提示:

# 載入 pandas 模組縮寫為 pd
import ___ as ___

# 建構資料
___ = [[9, 203674, 13.2, 18894],
       [11.7, 180785, 12.3, 54894],
       [10.1, 127802, 14.7, 18563],
       [11.8, 28604, 14.9, 21963],
       [13.2, 600, 13.1, 900],
       [6.9, 38071, 9.6, 3555],
       [12.1, 35660, 10.6, 9005],
       [12, 15000, 13, 12000],
       [11.7, 48770, 9.1, 14370],
       [9.84, 6100, 11.89, 8980]]
___ = ["三重市", "台中市", "台北一", "台北二", "台東市", "板橋區", "高雄市", "嘉義市", "鳳山區", "豐原區"]
___ = ["西瓜價", "西瓜量", "香瓜價", "香瓜量"]

df = pd.___(___, columns=___,  index=___)
print('西瓜與香瓜之拍賣行情價量表')
print(df)
print()  # 使用print分隔


df1 = df.___(by="___", ascending=___, kind='___')
print('以西瓜價遞減排序')
print(df1['西瓜價'])
print()  # 使用print分隔

# 計算台北一市場西瓜/香瓜價量的行情並輸出
df.___["___"]
print('台北一市場的行情')
print(df.___["___"])
print()  # 使用print分隔

indexs[0] = "三重區"
df.index = ____
____[____] = "洋香瓜價"
____[____] = "洋香瓜量"
df.____ = ____
print('全體市場行情')
print(df)

參考答案:

# 載入 pandas 模組縮寫為 pd
import pandas as pd

# 建構資料
price = [[9, 203674, 13.2, 18894],
       [11.7, 180785, 12.3, 54894],
       [10.1, 127802, 14.7, 18563],
       [11.8, 28604, 14.9, 21963],
       [13.2, 600, 13.1, 900],
       [6.9, 38071, 9.6, 3555],
       [12.1, 35660, 10.6, 9005],
       [12, 15000, 13, 12000],
       [11.7, 48770, 9.1, 14370],
       [9.84, 6100, 11.89, 8980]]
indexs = ["三重市", "台中市", "台北一", "台北二", "台東市", "板橋區", "高雄市", "嘉義市", "鳳山區", "豐原區"]
columns = ["西瓜價", "西瓜量", "香瓜價", "香瓜量"]

# a. 建立 DataFrame 並輸出
df = pd.DataFrame(price, columns=columns, index=indexs)
print('西瓜與香瓜之拍賣行情價量表')
print(df)
print() 

# b. 以西瓜價遞減排序 (關鍵:加入 kind='mergesort' 確保穩定排序)
df1 = df.sort_values(by="西瓜價", ascending=False, kind='mergesort')
print('以西瓜價遞減排序')
print(df1['西瓜價'])
print() 

# c. 計算台北一市場行情 (關鍵:使用 loc)
print('台北一市場的行情')
print(df.loc["台北一"])
print() 

# d. 修改名稱並重新輸出表格 (關鍵:依照題目填空邏輯修改變數)
indexs[0] = "三重區"
df.index = indexs
columns[2] = "洋香瓜價"
columns[3] = "洋香瓜量"
df.columns = columns
print('全體市場行情')
print(df)

 

意如老師小叮嚀:

在 CodeJudger 這種自動評分系統中,「輸出字元完全一致」 是拿分的唯一標準。

考試時請務必觀察題目留下的「底線(空格)」位置,不要隨意變更變數名稱或使用非預期的函數喔!

連結舊版本

Yiru@Studio - 關於我 - 意如