一、建立今天的練習資料
在 Google Colab 匯入 Pandas,先建立一組書籍資料。
import pandas as pd
data = [
{"title": "Book A", "price": 51.77, "rating": 3},
{"title": "Book B", "price": 35.02, "rating": 5},
{"title": "Book C", "price": 17.46, "rating": 4},
{"title": "Book D", "price": 22.50, "rating": 3},
{"title": "Book E", "price": 45.20, "rating": 5},
{"title": "Book F", "price": 18.90, "rating": 4},
{"title": "Book G", "price": 29.99, "rating": 3},
{"title": "Book H", "price": 39.80, "rating": 4}
]
df = pd.DataFrame(data)
print(df)
這份資料包含書名、價格和評分。
接下來就要用這些欄位進行分析。
二、什麼是 GroupBy?
假設資料如下:
title
price
rating
Book A
51.77
3
Book B
35.02
5
Book C
17.46
4
Book D
22.50
3
Book E
45.20
5
Book F
18.90
4
如果想知道每個評分有幾本書,就可以按照 rating 分組。
概念如下:
所有書籍
↓
按照 rating 分組
↓
評分 3:Book A、Book D
評分 4:Book C、Book F
評分 5:Book B、Book E
↓
計算每組的資料筆數
在 Pandas 裡面可以寫:
df.groupby("rating").size()
groupby() 負責分組,size() 則計算每組有幾筆資料。
如果想看結果,可以執行:
print(df.groupby("rating").size())
結果會類似:
rating
3 3
4 3
5 2
dtype: int64
代表評分 3 有 3 本書、評分 4 有 3 本書、評分 5 有 2 本書。
三、計算不同評分的平均價格
除了統計數量,也可以分析每個評分的平均價格。
average_price = df.groupby("rating")["price"].mean()
print(average_price)
這段程式的意思是:
groupby("rating"):按照評分分組。
["price"]:選擇價格欄位。
.mean():計算每組的平均價格。
這樣就能比較不同評分的書籍,平均價格是否有所差異。
也可以改成計算最高價格:
print(df.groupby("rating")["price"].max())
或者最低價格:
print(df.groupby("rating")["price"].min())
同一個分組方式,可以搭配不同的統計方法。
四、一次計算多種統計數據
如果每次只能計算一個數據,還是有點麻煩。
Pandas 可以使用 agg() 一次計算多種統計值。
result = df.groupby("rating")["price"].agg(
["count", "mean", "min", "max"]
)
print(result)
這裡的功能分別是:
方法
意義
count
計算非缺失值的數量
mean
平均價格
min
最低價格
max
最高價格
執行後會得到一張新的統計表,可以一次比較每個評分的價格分布。
這種方式在分析大量資料時很實用,因為不需要重複撰寫多段程式。
五、找出價格最高的書籍
除了分組統計,也可以進一步找出價格最高的書。
expensive_books = df.sort_values(
by="price",
ascending=False
)
print(expensive_books.head(3))
其中:
by="price":按照價格排序。
ascending=False:由高到低排序。
head(3):只顯示前三筆。
如果想從低到高排列,就改成:
ascending=True
這種排序方式可以用來找出最貴或最便宜的商品,也能用在之後的價格分析專題。
六、找出每個評分中最貴的書
如果不只是想知道全體最貴的書,而是想知道「每個評分中最貴的書」,就可以搭配 groupby() 和 idxmax()。
index = df.groupby("rating")["price"].idxmax()
result = df.loc[index]
print(result)
這段程式的步驟是:
按照評分分組。
找出每組價格最高的資料索引。
使用 loc 取出對應的完整資料列。
最後就可以看到評分 3、4、5 各自價格最高的書。
這個方法不只適用於書籍,也可以用在商品、銷售紀錄或其他有分類的資料。
七、把前幾天的爬蟲資料接進來
前面已經建立過 all_books,裡面存放爬蟲取得的書籍資料。
如果資料已經包含數值型態的 price 和 rating,就可以直接轉成 DataFrame。
df = pd.DataFrame(all_books)
print(df.head())
print(df.shape)
接著分析各評分的書籍數量:
rating_count = df.groupby("rating").size()
print(rating_count)
分析不同評分的平均價格:
rating_price = df.groupby("rating")["price"].mean()
print(rating_price)
找出價格最高的 10 本書:
top_10 = df.sort_values(
by="price",
ascending=False
).head(10)
print(top_10)
注意:如果你目前的 all_books 是 Day 17 的版本,價格可能仍然是 £51.77 這種文字格式,而且評分也可能還是英文單字。這時要先按照 Day 15 的方式清理價格,並把評分轉成數字,才能直接進行上述分析。
八、將分析結果存成 CSV
完成分組統計後,可以把結果存起來,供之後製作圖表使用。
rating_summary = df.groupby("rating")["price"].agg(
["count", "mean", "min", "max"]
)
rating_summary.to_csv(
"rating_summary.csv",
encoding="utf-8-sig"
)
print("分析結果已儲存")
在 Google Colab 中,可以從左側的檔案區找到 rating_summary.csv。
這樣就完成了:
爬蟲資料 → Pandas → 分組統計 → CSV 分析結果。
九、今天的實作總整理
今天主要練習了以下幾個方法:
程式
用途
groupby()
按照欄位分組
size()
計算每組資料筆數
mean()
計算平均值
agg()
一次執行多種統計
sort_values()
排序資料
idxmax()
找出最大值所在的索引
to_csv()
將分析結果輸出成 CSV
目前的資料處理流程已經逐漸完整:
網站
↓
Requests + BeautifulSoup
↓
取得爬蟲資料
↓
Pandas DataFrame
↓
資料清理
↓
分組統計與排序
↓
匯出分析結果
十、Day 20 學習心得
今天學到 Pandas 的分組統計,發現它比自己用迴圈一筆一筆計算方便很多。只要使用 groupby(),就可以按照評分或其他欄位分類,再計算每組的數量、平均值和最高價格。
我也練習了 agg() 和 sort_values(),開始能夠從大量資料中整理出比較有用的資訊。接下來想繼續把爬蟲資料和資料分析結合,讓這些數據可以透過圖表更直觀地呈現出來。