本文 AI 產出,尚未審核

Python 資料處理(Data Processing)── pandas & numpy 基礎

簡介

在資料科學、機器學習以及商業分析的工作流程中,資料處理是所有後續分析的根基。即使模型再先進,若輸入的資料品質不佳、結構不一致,最終的結果也會大打折扣。Python 之所以成為資料處理的首選語言,主要歸功於兩個強大的套件:NumPypandas。NumPy 提供高效能的多維陣列運算,而 pandas 則在此基礎上加入了「表格」概念(DataFrame),讓我們能像操作 Excel 那樣直觀地清洗、轉換、彙總資料。

本篇文章針對 初學者到中級開發者,從核心概念出發,搭配實用範例,說明如何使用 pandas 與 NumPy 完成常見的資料處理任務,並提供常見陷阱與最佳實踐,幫助你在真實專案中快速上手。


核心概念

1. NumPy 陣列(ndarray)

  • 固定類型:NumPy 陣列中的所有元素必須是同一資料型別,這讓底層的 C 語言實作能夠以連續記憶體存取,效能遠高於 Python 原生 list。
  • 向量化運算:大部分的算術、統計、邏輯運算都可以直接套用在整個陣列上,省去寫迴圈的麻煩。

範例 1:建立與基本運算

import numpy as np

# 建立一維陣列
a = np.array([1, 2, 3, 4])
print("a:", a)

# 建立二維陣列(矩陣)
b = np.array([[1, 2], [3, 4]])
print("b:\n", b)

# 向量化加法與乘法
c = a * 2          # 每個元素乘以 2
d = a + np.arange(4)  # 與另一個等長陣列相加
print("c:", c)
print("d:", d)

重點a * 2a + np.arange(4) 都是 向量化 操作,底層不會跑 Python 迴圈,速度快數十倍。


2. pandas 基本結構:Series 與 DataFrame

  • Series:類似一維陣列,但每個元素都有一個「索引」 (index)。可視為帶標籤的 NumPy 陣列。
  • DataFrame:由多個 Series 組成的二維表格,行列皆可自訂索引,功能類似資料庫的表格或 Excel 工作表。

範例 2:從字典建立 DataFrame

import pandas as pd

data = {
    "姓名": ["Alice", "Bob", "Charlie", "Diana"],
    "年齡": [25, 30, 22, 28],
    "城市": ["台北", "新北", "台中", "高雄"]
}
df = pd.DataFrame(data)
print(df)

輸出:

      姓名  年齡  城市
0   Alice  25  台北
1     Bob  30  新北
2  Charlie  22  台中
3   Diana  28  高雄

技巧:若不指定 index,pandas 會自動產生 0 起始的整數索引;你也可以自行傳入 index=['A','B','C','D'] 來自訂。


3. 讀寫資料(CSV、Excel、SQL)

pandas 內建多種 I/O 函式,讓資料載入、匯出變得非常簡單。

範例 3:讀取 CSV、寫入 Excel

# 讀取 CSV(自動偵測編碼與分隔符)
df_csv = pd.read_csv("sales_2023.csv")

# 顯示前 5 筆資料
print(df_csv.head())

# 將 DataFrame 寫入 Excel(保留索引或不保留皆可)
df_csv.to_excel("sales_2023_processed.xlsx", index=False)

提醒:在處理中文檔案時,常見的編碼問題可以透過 encoding='utf-8-sig'encoding='big5' 來解決。


4. 資料清理(缺失值、重複值、資料型別轉換)

資料清理是「資料處理」最常見且最耗時的工作。pandas 提供了直觀的 API 來處理這些問題。

範例 4:缺失值與重複值處理

# 建立範例 DataFrame
df = pd.DataFrame({
    "產品": ["A", "B", "C", "A", None],
    "銷量": [100, 150, None, 100, 200],
    "日期": pd.to_datetime(["2023-01-01", "2023-01-02", "2023-01-03", "2023-01-01", "2023-01-04"])
})

# 1. 檢查缺失值
print(df.isnull())

# 2. 移除全部缺失值的列
df_clean = df.dropna()
print("\n移除缺失值後:")
print(df_clean)

# 3. 填補缺失值(以平均值填補銷量)
df["銷量"] = df["銷量"].fillna(df["銷量"].mean())

# 4. 移除重複列(保留第一筆)
df_nodup = df.drop_duplicates(subset=["產品", "日期"], keep="first")
print("\n移除重複值後:")
print(df_nodup)

5. 數值運算與彙總(groupby、pivot)

利用 groupbypivot_table,可以快速完成分組統計、交叉彙總等分析。

範例 5:銷售資料分組彙總

# 假設已有 sales DataFrame
sales = pd.DataFrame({
    "城市": ["台北", "台北", "新北", "新北", "台中", "台中"],
    "產品": ["A", "B", "A", "B", "A", "B"],
    "銷量": [120, 80, 150, 70, 90, 60]
})

# 1. 依城市與產品分組,計算總銷量
grouped = sales.groupby(["城市", "產品"]).agg(總銷量=("銷量", "sum"))
print(grouped)

# 2. 使用 pivot_table 產生交叉表
pivot = sales.pivot_table(index="城市", columns="產品", values="銷量", aggfunc="sum", fill_value=0)
print("\n交叉表:")
print(pivot)

常見陷阱與最佳實踐

陷阱 說明 解決方式 / 最佳實踐
資料類型不一致 讀取 CSV 時,數字被當成字串或日期被解析成物件。 使用 dtype 參數指定類型,或在讀取後 pd.to_numeric()pd.to_datetime() 轉換。
隱式視圖 (view) vs 複製 (copy) 使用切片 (slice) 時,某些操作會返回視圖,導致原始資料被意外改變。 df.loc[:, ...].copy() 明確產生副本;或在警告訊息出現時使用 SettingWithCopyWarning
大資料集記憶體不足 直接載入整個檔案佔用過多 RAM。 使用 chunksize 分批讀取、或 daskvaex 等延遲運算框架。
使用迴圈遍歷 DataFrame 逐列 for i, row in df.iterrows(): 效能極差。 盡量改寫為向量化或 apply(注意 apply 仍比純向量化慢),必要時使用 NumPy 直接運算。
忽略索引對齊 加、減、乘等運算時,pandas 會依索引自動對齊,若索引不一致會產生 NaN。 確保索引一致或使用 reset_index(drop=True) 重新編排。

最佳實踐

  1. 先檢視再處理:使用 df.info()df.describe()df.head() 了解資料概況。
  2. 盡量向量化:把迴圈改寫成 NumPy / pandas 原生運算。
  3. 明確設定索引:索引是 pandas 的核心,適當設定能提升查詢與合併效率。
  4. 保持程式碼可讀性:使用 pipe、自訂函式將長流程拆解,方便維護與測試。
  5. 記得釋放資源:大資料集處理完畢後,可使用 del df; gc.collect() 釋放記憶體。

實際應用場景

場景 需求 pandas / NumPy 如何協助
電商每日銷售報表 合併多個 CSV、計算每日、每類別、每城市的銷售總額 read_csv + concat + groupby + pivot_table
金融時間序列分析 以日、週、月為頻率重採樣、缺失值前向填補 pd.to_datetime + set_index + resample + ffill
醫療影像前處理 大量影像矩陣的標準化、裁切、批次運算 使用 NumPy 的向量化算子 (np.mean, np.std) 以及 Numba JIT 加速
文字情感分析前置 文字資料清洗、斷詞、向量化 pandas 讀取 CSV → apply 文字前處理 → sklearnCountVectorizer
IoT 感測資料即時監控 每秒鐘上千筆資料的即時聚合與異常偵測 pandasrollingexpanding 統計 + NumPy 高效算子,配合 modindask 分散運算

總結

  • NumPy 為高效能的多維陣列運算基礎,向量化 是提升效能的關鍵。
  • pandas 在 NumPy 之上提供了 SeriesDataFrame,讓表格資料的讀寫、清理、彙總變得直觀且功能完整。
  • 透過 read/write、缺失值處理、分組彙總、pivot 等核心 API,我們可以在短時間內完成從「原始資料」到「可視化/模型輸入」的完整流程。
  • 注意常見陷阱(資料型別、索引對齊、記憶體)與最佳實踐(向量化、明確索引、分批處理),才能在真實專案中保持程式的 效能可維護性

掌握了本文的概念與範例,你就能在日常工作中自信地使用 pandas 與 NumPy 處理各式資料,為後續的分析、機器學習或商業決策奠定堅實基礎。祝你在資料處理的旅程中玩得開心、收穫滿滿! 🚀