Pandas¶
假查:注意有沒有寫到的重點: 缺失直處理 重複直處理 異常直處理
Pandas 是 Python 裡最常用的「表格資料處理」套件。
如果 NumPy 像一台很快的計算機,Pandas 就像是可以用程式控制的 Excel。
- Excel:用滑鼠點選、篩選、排序、做樞紐分析表。
- Pandas:用 Python 指令讀資料、篩選資料、整理資料、統計資料、輸出報表。
只要資料能整理成表格,就可以用 Pandas 批次處理、統計、分析、輸出。
Pandas 可以幹嘛?¶
請先想像一張 Excel 表格:
| 姓名 | 班別 | 投遞職缺 | 薪資下限 | 薪資上限 | 面試邀約 | 錄取狀態 |
|---|---|---|---|---|---|---|
| 小安 | Python資料分析班 | 資料助理 | 32000 | 40000 | 是 | 等待中 |
| 小宇 | 網頁前端班 | 前端助理 | 34000 | 43000 | 否 | 未錄取 |
如果只有 2 筆,用眼睛看就可以。但如果有 2000 筆、2 萬筆、20 萬筆呢?
你可能會想問:
- 哪個班別平均薪資最高?
- 哪個產業面試機會最多?
- 哪些工作高薪但通勤太久?
- 哪些學員投很多履歷卻沒有面試?
- 哪些公司評分高、可遠端、薪資也不錯?
這些問題如果手動用 Excel 做,每次資料更新都要重做一次。Pandas 的好處是:
- 寫好一次程式。
- 換新的 CSV。
- 重新執行。
- 報表就自動更新。
這就是「資料自動化」。
DataFrame 與 Series¶
Pandas 最重要的兩個角色:
| 名稱 | 白話理解 | 像 Excel 的什麼 |
|---|---|---|
DataFrame |
一整張表格 | 工作表 |
Series |
表格中的一欄 | 一欄資料 |
基本寫法:
import pandas as pd
data = {
"姓名": ["小安", "小宇", "小婷"],
"投遞數": [8, 5, 6],
"面試數": [3, 1, 2],
}
df = pd.DataFrame(data)
print(df)
可以把 df 想成一張表。
# 如果取單一欄:
df["姓名"] # 得到的是 `Series`,也就是一欄資料。
# 如果取多欄:
df[["姓名", "投遞數"]] # 得到的是新的 `DataFrame`,也就是比較小張的表。
讀取 CSV 與基本觀察¶
資料共有 72 筆,欄位包含:
| 欄位 | 說明 |
|---|---|
| 學員編號 | 學員代號 |
| 姓名 | 學員姓名 |
| 年齡 | 學員年齡 |
| 居住縣市 | 學員所在地 |
| 班別 | 參訓班別 |
| 投遞職缺 | 投遞的工作名稱 |
| 公司名稱 | 投遞公司 |
| 公司產業 | 公司類型 |
| 薪資下限 | 職缺薪資下限 |
| 薪資上限 | 職缺薪資上限 |
| 通勤分鐘 | 預估單趟通勤時間 |
| 投遞日期 | 投遞履歷日期 |
| 面試邀約 | 是否有面試 |
| 錄取狀態 | 錄取、未錄取、等待中 |
| 滿意度 | 學員對這次機會的主觀滿意度 |
| 備註 | 補充說明 |
常用觀察指令:
| 指令 | 用途 |
|---|---|
head() |
看前幾筆 |
tail() |
看最後幾筆 |
shape |
看幾列幾欄 |
columns |
看欄位名稱 |
info() |
看欄位型態、缺失值 |
describe() |
看數值欄位摘要 |
欄位選取與新增欄位¶
只是 Pandas 可以對整份資料一次做完。
條件篩選¶
Pandas 多條件很常寫錯,請特別提醒:
- 條件要用括號包起來。
- 「而且」用
&。 - 「或者」用
|。 - 不能直接用 Python 的
and、or。
排序¶
# 依平均薪資排序:
df.sort_values(by="平均薪資", ascending=False)
# 多欄排序:
df.sort_values(by=["平均薪資", "通勤分鐘"], ascending=[False, True])
# 1. 平均薪資高的排前面。
# 2. 如果薪資差不多,通勤時間短的排前面。
groupby 分組統計¶
groupby 是 Pandas 非常重要、也非常值得慢慢講的功能。
# 基本寫法:
df.groupby("班別")["平均薪資"].mean()
# 1. `df.groupby("班別")`:先依班別分堆。
# 2. `["平均薪資"]`:每一堆只看平均薪資欄位。
# 3. `.mean()`:每一堆算平均。
# 多個統計:
df.groupby("班別").agg(
投遞筆數=("學員編號", "count"),
平均薪資=("平均薪資", "mean"),
平均通勤=("通勤分鐘", "mean"),
)
缺失值與資料清理¶
真實資料很少是乾淨的。
常見問題:
- 有空白
- 有缺失值
- 欄位名稱不一致
- 同一個東西有不同寫法,例如
台北市、臺北市 -
數字被讀成文字
# 檢查缺失值:
df.isna().sum()
# 填補缺失值:
df["備註"] = df["備註"].fillna("無")
# 去除文字前後空白:
df["姓名"] = df["姓名"].str.strip()
pivot_table:樞紐分析表¶
Excel 裡的樞紐分析表,Pandas 也有。
pivot = pd.pivot_table(
df,
index="班別", # 列方向:班別
columns="錄取狀態", # 欄方向:錄取狀態
values="學員編號", #
aggfunc="count", # 內容:計算學員編號筆數
fill_value=0, # 空值補 0
)
merge:合併兩張表¶
職場資料常常不是一張表搞定。
職訓班求職追蹤.csv:每筆投遞紀錄。公司評分.csv:每間公司的評分、是否遠端、加班程度。- 範例:merge合併公司評分.py
# 合併寫法:
merged = jobs.merge(companies, on="公司名稱", how="left")
# 可以用 Excel 的 VLOOKUP 來解釋:用「公司名稱」當共同欄位,把公司評分接到求職追蹤表後面。
# `how="left"` 的意思是:
# - 以左邊的 `jobs` 為主。
# - 如果右邊 `companies` 找得到公司名稱,就補上資料。
# - 找不到就變成缺失值。
輸出報表¶
# 輸出 CSV:
class_summary.to_csv(output_path, encoding="utf-8-sig")
# 因為有些 Windows 版 Excel 直接打開 UTF-8 CSV 時,中文可能會亂碼。`utf-8-sig` 對 Excel 通常比較友善。