前面 17 天主要都在學 Python、HTTP、Requests、BeautifulSoup,以及實際把網站資料抓下來。
到目前為止,我已經可以做到:
網站
↓
Requests
↓
BeautifulSoup
↓
抓取資料
↓
清理資料
↓
處理錯誤
↓
Retry
↓
取得結構化資料
但如果今天要開始分析 1000 筆甚至更多資料,只使用 List 和 Dictionary 會變得比較麻煩。
例如之前的資料是:
[
{
"title": "...",
"price": 51.77,
"stock": 22,
"rating": 3
},
...
]
如果資料越來越多,想要:
找出最高價格
計算平均價格
篩選評分
排序
統計資料
找出缺失值
就會需要寫很多程式。
所以從今天開始,我要正式進入 Pandas 資料分析。
一、什麼是 Pandas?
Pandas 是 Python 很常使用的資料分析套件。
如果把資料分析想成處理 Excel:
Excel
↓
表格
↓
欄位
↓
資料列
↓
篩選
↓
排序
↓
統計
Pandas 就可以在 Python 裡完成類似的事情。
其中最重要的資料結構叫做:
DataFrame
可以把它想成一張可以用 Python 操作的表格。
例如:
Book A 51.77 22 3
Book B 35.02 10 5
Book C 17.46 35 4
這就是 DataFrame 很適合處理的資料。
二、先在 Colab 安裝/匯入 Pandas
Google Colab 通常已經有 Pandas,所以不需要另外安裝。
直接:
import pandas as pd
這裡的:
pd
是 Pandas 常見的縮寫。
所以之後看到:
pd.DataFrame()
就知道是在使用 Pandas。
三、建立第一個 DataFrame
先自己建立一些書籍資料。
import pandas as pd
books = [
{
"title": "Book A",
"price": 51.77,
"stock": 22,
"rating": 3
},
{
"title": "Book B",
"price": 35.02,
"stock": 10,
"rating": 5
},
{
"title": "Book C",
"price": 17.46,
"stock": 35,
"rating": 4
}
]
df = pd.DataFrame(books)
print(df)
會得到類似:
title price stock rating
0 Book A 51.77 22 3
1 Book B 35.02 10 5
2 Book C 17.46 35 4
這就是 DataFrame。
四、DataFrame 的基本概念
現在可以把它想成一個表格。
欄位
↓
title price stock rating
↓ ↓ ↓ ↓
Book A 51.77 22 3
Book B 35.02 10 5
Book C 17.46 35 4
↑
資料列
每一個欄位都有自己的資料。
例如:
df["price"]
就是取得 price 欄位。
print(df["price"])
可能會得到:
0 51.77
1 35.02
2 17.46
Name: price, dtype: float64
五、查看資料前幾筆
如果之後真的有 1000 筆資料,不可能全部 print() 出來。
所以可以使用:
df.head()
例如:
print(df.head())
預設會顯示前 5 筆資料。
也可以:
df.head(3)
只看前 3 筆。
六、查看最後幾筆資料
相反地,如果想看最後幾筆:
df.tail()
例如:
print(df.tail())
這對檢查爬蟲資料很方便。
例如:
前面資料正常嗎?
最後一頁資料有沒有成功抓到?
都可以快速確認。
七、查看資料有幾列、幾欄
這個功能我覺得在爬蟲很實用。
print(df.shape)
例如:
(1000, 4)
代表:
1000 列
4 個欄位
也就是:
1000 筆書籍資料
4 個資料欄位
八、查看欄位名稱
可以使用:
print(df.columns)
例如:
Index(['title', 'price', 'stock', 'rating'], dtype='object')
也可以:
print(df.columns.tolist())
結果會比較容易閱讀:
['title', 'price', 'stock', 'rating']
九、查看資料型態
前面有特別提到資料清理。
現在可以使用 Pandas 直接查看:
print(df.dtypes)
可能會看到:
title object
price float64
stock int64
rating int64
這裡就可以確認:
title
→ 文字
price
→ 浮點數
stock
→ 整數
rating
→ 整數
這也是為什麼 Day 15 要把價格從:
£51.77
整理成:
51.77
如果沒有整理好,之後 Pandas 可能會把價格當成文字。
十、開始做真正的資料分析
現在資料已經進入 DataFrame。
例如我要找出平均價格:
average_price = df["price"].mean()
print("平均價格:", average_price)
這裡的:
.mean()
就是計算平均值。
找最高價格
print(df["price"].max())
找最低價格
print(df["price"].min())
計算價格總和
print(df["price"].sum())
計算書籍數量
print(df["title"].count())
所以基本統計可以變成:
print("平均價格:", df["price"].mean())
print("最高價格:", df["price"].max())
print("最低價格:", df["price"].min())
print("總價格:", df["price"].sum())
這比自己用 for 迴圈處理方便很多。
十一、篩選資料
這是 Pandas 很重要的功能。
例如我只想看價格大於 40 的書:
expensive_books = df[df["price"] > 40]
print(expensive_books)
它會把符合條件的資料列出來。
概念上就是:
所有書
↓
price > 40 ?
↓
是 → 保留
否 → 排除
十二、篩選高評分書籍
例如只想看評分 4 分以上:
high_rating = df[df["rating"] >= 4]
print(high_rating)
這樣就可以快速找出高評分資料。
十三、同時使用兩個條件
例如:
「價格小於 30,而且評分至少 4 分」
可以寫:
result = df[
(df["price"] < 30) &
(df["rating"] >= 4)
]
print(result)
這裡:
&
代表「而且」。
所以:
price < 30
+
rating >= 4
兩個條件都符合才會留下來。
十四、排序資料
假設我想按照價格由低到高排序:
sorted_df = df.sort_values(
"price"
)
print(sorted_df)
如果想從高到低:
sorted_df = df.sort_values(
"price",
ascending=False
)
print(sorted_df)
這樣就可以很快找到價格最高的書。
十五、把前幾天的爬蟲接進 Pandas
這才是今天最重要的實作。
前面我們已經有:
all_books
而且裡面有很多 Dictionary:
[
{
"title": "...",
"price": 51.77,
"stock": 22,
"rating": 3
},
...
]
所以現在只需要:
df = pd.DataFrame(all_books)
就可以把爬蟲資料轉成 DataFrame。
完整來看:
import pandas as pd
df = pd.DataFrame(all_books)
print(df.head())
print(df.shape)
print(df.dtypes)
這就是:
爬蟲
↓
all_books
↓
Pandas DataFrame
↓
資料分析
十六、直接分析爬蟲資料
例如:
print("資料筆數:", len(df))
print(
"平均價格:",
df["price"].mean()
)
print(
"最高價格:",
df["price"].max()
)
print(
"最低價格:",
df["price"].min()
)
print(
"平均評分:",
df["rating"].mean()
)
如果前面的爬蟲成功抓到 1000 本書,就可以直接對這 1000 筆資料進行分析。
十七、查看整體統計資訊
Pandas 還提供一個很方便的功能:
print(df.describe())
它會自動整理數值欄位的統計資訊,例如:
price stock rating
count ...
mean ...
std ...
min ...
25% ...
50% ...
75% ...
max ...
這裡可以快速看到:
資料筆數
平均值
標準差
最小值
四分位數
最大值
目前可能還不需要完全理解每一個統計量,但先知道 describe() 可以快速查看資料的基本統計就很有用。
十八、今天的完整實作
如果把今天學到的內容整理成一個小流程:
import pandas as pd
df = pd.DataFrame(all_books)
print(df.head())
print("資料大小:", df.shape)
print(df.dtypes)
print(
"平均價格:",
df["price"].mean()
)
print(
"最高價格:",
df["price"].max()
)
print(
"最低價格:",
df["price"].min()
)
print(
"平均評分:",
df["rating"].mean()
)
cheap_books = df[
df["price"] < 20
]
print(cheap_books)
sorted_books = df.sort_values(
"price",
ascending=False
)
print(sorted_books.head())
這時候已經不是單純「爬蟲」了,而是開始完成:
爬蟲 → 資料清理 → 資料分析
十九、今天的實作流程
今天最大的變化就是加入 Pandas:
網站
↓
Requests
↓
BeautifulSoup
↓
抓取資料
↓
資料清理
↓
List + Dictionary
↓
Pandas DataFrame
↓
篩選
↓
排序
↓
統計
之前如果要分析資料,可能要自己寫很多 for 迴圈。
現在 Pandas 可以直接使用:
.mean()
.max()
.min()
.sum()
.sort_values()
來處理大量資料。