iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
自我挑戰組

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

Day 22|Pandas 資料分析實戰:整合爬蟲資料,完成書籍分析專案

  • 分享至 

  • xImage
  •  

一、今天的實作目標

今天會完成以下流程:

建立書籍資料並轉換成 DataFrame。

清理缺失值與重複資料。

新增價格分類欄位。

分析不同評分的書籍數量與平均價格。

找出最貴的書籍。

輸出整理後的資料與分析報表。

整個流程可以理解成:

原始書籍資料

爬蟲取得的書名、價格、評分

資料清理

處理缺失值、重複資料與資料型態

資料分析

價格分類、評分統計、平均價格

輸出分析結果

清理後的 CSV 與統計報表

二、建立今天的練習資料

為了讓這份程式可以直接在 Google Colab 執行,我先建立一組模擬書籍資料。實際操作時,也可以把資料來源替換成前幾天爬蟲取得的 all_books。

import pandas as pd

data = {
"title": [
"Book A", "Book B", "Book C", "Book D",
"Book E", "Book F", "Book G", "Book H",
"Book B", "Book I"
],
"price": [
15.99, 25.50, 8.99, 45.00,
32.99, 12.50, 55.00, None,
25.50, 18.99
],
"rating": [
5, 4, 3, 5, 2, 4, 5, 3, 4, None
]
}

df = pd.DataFrame(data)

print(df)
print("資料筆數:", len(df))

這組資料特別保留了幾種常見情況:有一筆缺少價格、有一筆缺少評分,也有重複的 Book B。

這是刻意安排的,因為真實爬蟲取得的資料不一定完整,也可能因為爬取或合併資料的方式而產生重複紀錄。

三、清理缺失值與重複資料

在分析之前,我們需要先確認資料是否完整。

查看每個欄位的缺失值數量

print(df.isnull().sum())

查看重複的書籍資料

print("重複資料筆數:", df.duplicated().sum())

移除完全重複的資料列

df = df.drop_duplicates()

移除價格或評分缺失的資料

df = df.dropna(subset=["price", "rating"])

print("清理後資料筆數:", len(df))
print(df)

這裡使用了前幾天學過的兩個方法:

drop_duplicates():移除所有欄位都相同的重複資料列。

dropna(subset=["price", "rating"]):只要價格或評分其中一個缺失,就排除該筆資料。

要注意,這裡的重複判斷是以整列資料為準。如果同一本書出現兩次,但價格或評分不同,drop_duplicates() 不一定會將它視為重複資料。因此,實際專案中還需要依照資料特性決定判斷重複的規則。

四、新增價格分類欄位

接下來,依照書籍價格將資料分成三種類別:

低價:價格低於 20。

一般:價格大於或等於 20,且小於或等於 40。

高價:價格高於 40。

def classify_price(price):
if price < 20:
return "低價"
elif price <= 40:
return "一般"
else:
return "高價"

df["price_category"] = df["price"].apply(classify_price)

print(
df[["title", "price", "rating", "price_category"]]
)

這裡再次使用 apply(),將自訂的 classify_price() 套用到每一筆價格資料。

新增分類欄位的好處是,之後分析時不必每次都重新判斷價格區間,可以直接使用 price_category 進行統計。

五、分析不同評分的書籍

接下來,我想了解不同評分的書籍各有幾本,以及它們的平均價格是多少。

rating_summary = (
df.groupby("rating")
.agg(
book_count=("title", "count"),
average_price=("price", "mean"),
minimum_price=("price", "min"),
maximum_price=("price", "max")
)
.reset_index()
)

rating_summary = rating_summary.round(2)

print(rating_summary)

這裡使用 groupby("rating"),將相同評分的書籍放在同一組,再透過 agg() 同時計算多種統計數值。

例如:

book_count:每個評分有幾本書。

average_price:每個評分的平均價格。

minimum_price:每個評分的最低價格。

maximum_price:每個評分的最高價格。

有了這張表,就可以比較不同評分的書籍在價格上的分布。

不過,這份資料只能用來觀察價格與評分之間的情況,不能直接推論價格越高,書籍品質就一定越好。

六、統計不同價格分類的數量

除了依照評分分析,我們也可以統計低價、一般和高價書籍的數量。

category_summary = (
df.groupby("price_category")
.agg(
book_count=("title", "count"),
average_price=("price", "mean")
)
.reset_index()
)

category_summary = category_summary.round(2)

print(category_summary)

如果只想知道各分類的數量,也可以使用比較簡單的方式:

print(df["price_category"].value_counts())

value_counts() 適合快速查看每個類別出現的次數;groupby() 則適合進一步計算平均值、最大值或最小值。

這兩種方法可以依照分析需求搭配使用。

七、找出最貴的書籍

接著,我想從清理後的資料中找出價格最高的書。

most_expensive = df.loc[df["price"].idxmax()]

print("最貴的書籍:", most_expensive["title"])
print("價格:", most_expensive["price"])
print("評分:", most_expensive["rating"])

idxmax() 可以找出 price 欄位最大值所在的索引,再透過 loc[] 取得完整資料列。

如果之後想找出最便宜的書,可以將 idxmax() 改成 idxmin()。

這種查詢方式在分析商品、房價或其他具有數值欄位的資料時也很實用。

八、整理並輸出分析報表

完成資料清理和分析後,我們將結果輸出成 CSV,讓後續的資料庫實作可以繼續使用。

輸出清理後的書籍資料

df.to_csv(
"cleaned_books.csv",
index=False,
encoding="utf-8-sig"
)

輸出評分統計報表

rating_summary.to_csv(
"rating_summary.csv",
index=False,
encoding="utf-8-sig"
)

輸出價格分類統計報表

category_summary.to_csv(
"category_summary.csv",
index=False,
encoding="utf-8-sig"
)

print("三份 CSV 報表已完成!")

如果想直接從 Google Colab 下載檔案,可以執行:

from google.colab import files

files.download("cleaned_books.csv")

其他兩份報表也可以使用相同方式下載。

今天完成的三份檔案分別是:

檔案

內容

cleaned_books.csv

清理後的書籍資料與價格分類

rating_summary.csv

不同評分的書籍數量與價格統計

category_summary.csv

不同價格分類的數量與平均價格

九、套用到前幾天的爬蟲資料

如果已經有前幾天取得的 all_books,可以將程式中的模擬資料替換成:

df = pd.DataFrame(all_books)

print(df.head())
print(df.columns)
print(df.dtypes)

先確認實際欄位名稱與資料型態,再執行後續的清理和分析。

例如,假設爬蟲中的價格仍是 "£25.50" 這種文字,就要先移除英鎊符號並轉成數字;如果評分還是 "Three",也要先轉換成數值評分,才能進行平均值計算。

這也是我在實作中需要特別注意的地方:資料分析程式不只是要能執行,還必須確認輸入的資料格式符合預期。


上一篇
Day 21|Pandas 資料分析實戰:新增欄位、價格分類與統計分析
下一篇
Day 23|Python 資料分析實戰:使用 SQLite 建立資料庫與儲存爬蟲資料
系列文
Python 爬蟲與資料分析實戰:從網路資料到資訊視覺化 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言