iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
自我挑戰組

Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化系列 第 20 篇

Day 20|Pandas 進階資料分析:分組統計與資料排序

  • 分享至 

  • xImage
  •  

一、建立今天的練習資料

在 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(),開始能夠從大量資料中整理出比較有用的資訊。接下來想繼續把爬蟲資料和資料分析結合,讓這些數據可以透過圖表更直觀地呈現出來。


上一篇
Day 19|Pandas 資料清理:處理缺失值與重複資料
下一篇
Day 21|Pandas 資料分析實戰:新增欄位、價格分類與統計分析
系列文
Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言