本文 AI 產出,尚未審核
Python 資料處理(Data Processing)── pandas & numpy 基礎
簡介
在資料科學、機器學習以及商業分析的工作流程中,資料處理是所有後續分析的根基。即使模型再先進,若輸入的資料品質不佳、結構不一致,最終的結果也會大打折扣。Python 之所以成為資料處理的首選語言,主要歸功於兩個強大的套件:NumPy 與 pandas。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 * 2與a + 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)
利用 groupby 與 pivot_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 分批讀取、或 dask、vaex 等延遲運算框架。 |
| 使用迴圈遍歷 DataFrame | 逐列 for i, row in df.iterrows(): 效能極差。 |
盡量改寫為向量化或 apply(注意 apply 仍比純向量化慢),必要時使用 NumPy 直接運算。 |
| 忽略索引對齊 | 加、減、乘等運算時,pandas 會依索引自動對齊,若索引不一致會產生 NaN。 | 確保索引一致或使用 reset_index(drop=True) 重新編排。 |
最佳實踐:
- 先檢視再處理:使用
df.info()、df.describe()、df.head()了解資料概況。 - 盡量向量化:把迴圈改寫成 NumPy / pandas 原生運算。
- 明確設定索引:索引是 pandas 的核心,適當設定能提升查詢與合併效率。
- 保持程式碼可讀性:使用
pipe、自訂函式將長流程拆解,方便維護與測試。 - 記得釋放資源:大資料集處理完畢後,可使用
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 文字前處理 → sklearn 的 CountVectorizer |
| IoT 感測資料即時監控 | 每秒鐘上千筆資料的即時聚合與異常偵測 | pandas 的 rolling、expanding 統計 + NumPy 高效算子,配合 modin 或 dask 分散運算 |
總結
- NumPy 為高效能的多維陣列運算基礎,向量化 是提升效能的關鍵。
- pandas 在 NumPy 之上提供了 Series 與 DataFrame,讓表格資料的讀寫、清理、彙總變得直觀且功能完整。
- 透過 read/write、缺失值處理、分組彙總、pivot 等核心 API,我們可以在短時間內完成從「原始資料」到「可視化/模型輸入」的完整流程。
- 注意常見陷阱(資料型別、索引對齊、記憶體)與最佳實踐(向量化、明確索引、分批處理),才能在真實專案中保持程式的 效能 與 可維護性。
掌握了本文的概念與範例,你就能在日常工作中自信地使用 pandas 與 NumPy 處理各式資料,為後續的分析、機器學習或商業決策奠定堅實基礎。祝你在資料處理的旅程中玩得開心、收穫滿滿! 🚀