跳轉到

Pandas

假查:注意有沒有寫到的重點: 缺失直處理 重複直處理 異常直處理

Pandas 是 Python 裡最常用的「表格資料處理」套件。

如果 NumPy 像一台很快的計算機,Pandas 就像是可以用程式控制的 Excel。

  • Excel:用滑鼠點選、篩選、排序、做樞紐分析表。
  • Pandas:用 Python 指令讀資料、篩選資料、整理資料、統計資料、輸出報表。

只要資料能整理成表格,就可以用 Pandas 批次處理、統計、分析、輸出。

Pandas 可以幹嘛?

請先想像一張 Excel 表格:

姓名 班別 投遞職缺 薪資下限 薪資上限 面試邀約 錄取狀態
小安 Python資料分析班 資料助理 32000 40000 等待中
小宇 網頁前端班 前端助理 34000 43000 未錄取

如果只有 2 筆,用眼睛看就可以。但如果有 2000 筆、2 萬筆、20 萬筆呢?

你可能會想問:

  • 哪個班別平均薪資最高?
  • 哪個產業面試機會最多?
  • 哪些工作高薪但通勤太久?
  • 哪些學員投很多履歷卻沒有面試?
  • 哪些公司評分高、可遠端、薪資也不錯?

這些問題如果手動用 Excel 做,每次資料更新都要重做一次。Pandas 的好處是:

  1. 寫好一次程式。
  2. 換新的 CSV。
  3. 重新執行。
  4. 報表就自動更新。

這就是「資料自動化」。

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() 看數值欄位摘要

欄位選取與新增欄位

# 選單一欄:
df["姓名"]

# 選多欄:
df[["姓名", "班別", "投遞職缺"]]

# 新增欄位:
df["平均薪資"] = (df["薪資下限"] + df["薪資上限"]) / 2

只是 Pandas 可以對整份資料一次做完。

條件篩選

Pandas 多條件很常寫錯,請特別提醒:

  • 條件要用括號包起來。
  • 「而且」用 &
  • 「或者」用 |
  • 不能直接用 Python 的 andor
# 單一條件:
df[df["面試邀約"] == "是"]

# 多條件:
mask = (df["平均薪資"] >= 40000) & (df["通勤分鐘"] <= 45)
df[mask]

排序

# 依平均薪資排序:
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:合併兩張表

職場資料常常不是一張表搞定。

# 合併寫法:
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 通常比較友善。

實作