一、今天的實作目標
今天會完成以下流程:
建立書籍資料並轉換成 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",也要先轉換成數值評分,才能進行平均值計算。
這也是我在實作中需要特別注意的地方:資料分析程式不只是要能執行,還必須確認輸入的資料格式符合預期。