Pandas 作為 Python 資料分析核心工具,提供 DataFrame 等高效資料結構和豐富操作方法,廣泛應用於資料科學、機器學習等領域。本文從基礎操作到進階應用,深入解析 Pandas 的各項功能,並結合實務案例,逐步引導讀者掌握資料處理技巧。內容涵蓋資料讀取、清洗、轉換、時間序列分析、探索性資料分析以及效能最佳化等導向,也探討與 NumPy、PyArrow 等其他 Python 資料科學工具的整合應用,幫助讀者建構完整的資料分析工作流程。本文同時提供 pandas 基礎概念的說明,例如 Series、DataFrame 和 Index,以及資料選取、指定、資料型別處理等基本操作,適合不同程度的讀者學習。

Pandas Cookbook 第三版:Python 實用資料分析秘笈

Pandas 是 Python 資料分析生態系中的核心工具,提供豐富的功能以支援科學計算、時間序列分析及探索性資料分析。本文結合實務經驗與具體範例,深入解析 Pandas 的強大功能。

為何選擇 Pandas?

在 2008 年,Wes McKinney 開始開發 Pandas 專案,當時 Python 在統計分析與商業分析領域尚未獲得廣泛應用。經過多年的發展,Pandas 已成為資料分析工作者的必備工具。

本文特色

本文由 William Ayd 與 Matthew Harrison 共同編著。William Ayd 是 Pandas 核心維護者,自 2018 年起參與專案開發;而 Matthew Harrison 則是 Python 與資料科學領域的知名作者與培訓師。本文結合兩者的專業知識,提供實用的 Pandas 使用技巧。

核心內容

  1. Pandas 基礎操作:涵蓋資料讀取、清理、轉換等基本功能。
  2. 進階資料操作:探討合併、重塑及分組資料的技巧。
  3. 時間序列分析:介紹如何處理時間序列資料,包括日期與時間的操作。
  4. 探索性資料分析:利用 Pandas 進行資料視覺化與統計分析。

程式碼實戰

以下是一個簡單的 Pandas 資料讀取範例:

import pandas as pd

# 讀取 CSV 檔案
data = pd.read_csv('data.csv')

# 顯示前五筆資料
print(data.head())

內容解密:

  • import pandas as pd:匯入 Pandas 函式庫並簡化名稱為 pd
  • pd.read_csv('data.csv'):使用 read_csv 方法讀取名為 data.csv 的檔案。
  • data.head():顯示 DataFrame 的前五列資料,用於快速檢視資料內容。

資料操作範例

假設我們有一個包含銷售資料的 DataFrame,我們可以使用 Pandas 進行資料篩選與彙總:

# 篩選特定條件的資料
filtered_data = data[data['sales'] > 1000]

# 按地區彙總銷售資料
summary = filtered_data.groupby('region')['sales'].sum()
print(summary)

內容解密:

  • data[data['sales'] > 1000]:篩選出銷售額超過 1000 的資料列。
  • groupby('region'):按 region 列進行分組。
  • ['sales'].sum():計算每個地區的銷售總額。

時間序列處理

Pandas 提供強大的時間序列處理功能,以下範例展示如何建立與操作日期範圍:

import pandas as pd

# 建立日期範圍
date_range = pd.date_range(start='2023-01-01', periods=10, freq='D')
print(date_range)

內容解密:

  • pd.date_range:建立一個日期範圍。
  • start='2023-01-01':設定起始日期。
  • periods=10:設定生成日期的數量。
  • freq='D':設定日期的頻率為每日。

探索性資料分析

利用 Pandas 可以輕鬆進行探索性資料分析,例如計算描述性統計量:

# 計算數值欄位的描述性統計
stats = data.describe()
print(stats)

內容解密:

  • data.describe():自動計算數值欄位的統計資訊,如平均值、標準差等。

本文目標讀者

本文適合以下讀者:

  • 需要深入瞭解 Pandas 功能的資料分析師。
  • 希望提升 Python 資料處理能力的開發者。
  • 對時間序列分析及探索性資料分析感興趣的研究人員。

結語

Pandas Cookbook 第三版提供了豐富的實務範例與深入解析,無論是初學者還是有經驗的使用者,都能從中獲得寶貴的知識與技巧。藉由本文,讀者將能更有效地利用 Pandas 處理各種資料分析任務,並提升工作效率。

pandas 技術深度解析與應用實務

pandas 是 Python 生態系統中最為重要的資料分析函式庫之一,提供高效的資料結構與資料分析工具,廣泛應用於資料科學、機器學習與金融分析等領域。本文將探討 pandas 的核心功能與技術細節,並透過實務案例展示其強大的資料處理能力。

資料結構基礎:Series 與 DataFrame

Series 的基本特性

Series 是 pandas 中的一維標籤化陣列,可視為具有索引的 NumPy 陣列擴充套件。其主要特性包括:

  1. 索引機制:每個元素都與一個索引對應,支援快速的資料查詢與操作
  2. 向量化運算:支援高效的數學運算與邏輯操作
  3. 缺失值處理:內建對缺失值(NaN)的支援與處理機制
import pandas as pd
import numpy as np

# 建立 Series 物件
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

#### 內容解密:
1. 匯入必要的函式庫pandas 用於資料處理numpy 用於數值計算
2. 建立 Series pandas 自動生成預設的整數索引0  5
3. np.nan 代表缺失值pandas 正確處理並保留其狀態
4. Series 自動推斷資料型別float64以容納 NaN 

DataFrame 的核心功能

DataFrame 是 pandas 中的二維標籤化資料結構,可視為具有列標籤的二維表格。其主要特性包括:

  1. 靈活的資料操作:支援豐富的資料篩選、轉換與合併操作
  2. 多維資料處理:可同時處理多列資料,並進行複雜的運算
  3. 強大的索引機制:支援多層索引與靈活的資料存取方式
# 建立 DataFrame 物件
data = {'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 35],
        'city': ['New York', 'London', 'Tokyo']}
df = pd.DataFrame(data)
print(df)

#### 內容解密:
1. 使用字典建立 DataFrame每個鍵成為一列
2. pandas 自動為每行生成預設整數索引
3. 不同列可包含不同資料型別字串與整數
4. DataFrame 正確對齊不同列的資料並保持結構完整性

資料選取與指定技術

根據位置的選取

pandas 提供 iloc 方法進行根據位置的資料選取,這種方法不依賴於索引的標籤,而是根據元素的實際位置進行存取。

# 建立範例 DataFrame
df = pd.DataFrame(np.arange(12).reshape(3, 4),
                  columns=['A', 'B', 'C', 'D'])

# 使用 iloc 選取資料
print(df.iloc[1:3, 0:2])

#### 內容解密:
1. iloc 使用根據整數的位置進行資料選取
2. 行切片1:3選取第 1 到第 2  0 開始計數
3. 列切片0:2選取第 0 到第 1 
4. 輸出結果為指定範圍內的元素構成的新 DataFrame

根據標籤的選取

相較於 ilocloc 方法支援根據索引標籤的資料選取,能夠更直觀地存取特定資料。

# 使用 loc 選取資料
df = pd.DataFrame(np.arange(12).reshape(3, 4),
                  index=['r1', 'r2', 'r3'],
                  columns=['A', 'B', 'C', 'D'])

print(df.loc['r1':'r2', 'A':'B'])

#### 內容解密:
1. loc 使用索引標籤進行資料選取
2. 行標籤範圍'r1':'r2'包含結束標籤 'r2'
3. 列標籤範圍'A':'B'同樣包含結束標籤 'B'
4. 這種方法提供了更具可讀性的資料存取方式

資料型別與缺失值處理

數值型別處理

pandas 支援多種數值型別,包括整數、浮點數等,並提供對缺失值的完整支援。

# 建立包含不同數值型別的 DataFrame
df = pd.DataFrame({
    'int_col': [1, 2, 3],
    'float_col': [1.1, 2.2, np.nan]
})

print(df.dtypes)

#### 內容解密:
1. int_col 正確推斷為 int64 型別
2. float_col 推斷為 float64 型別以容納 NaN 
3. pandas 自動選擇適當的資料型別以儲存資料
4. dtypes 屬性提供每列的資料型別資訊

缺失值處理策略

pandas 提供多種缺失值處理方法,包括刪除、填充等。

# 建立包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, np.nan, 3],
    'B': [4, 5, np.nan]
})

# 使用 fillna 方法填充缺失值
df_filled = df.fillna(0)
print(df_filled)

#### 內容解密:
1. fillna 方法用指定值0填充缺失值
2. 原始 DataFrame 中的 NaN 被替換為 0
3. 傳回新的 DataFrame 而不修改原始物件
4. 可根據需求選擇不同的填充策略

資料輸入輸出(I/O)操作

pandas 支援多種資料格式的讀寫操作,包括 CSV、Excel、SQL 等。

CSV 檔案操作

# 建立範例 DataFrame
data = {'name': ['Alice', 'Bob'],
        'age': [25, 30]}
df = pd.DataFrame(data)

# 寫入 CSV 檔案
df.to_csv('example.csv', index=False)

# 讀取 CSV 檔案
df_read = pd.read_csv('example.csv')
print(df_read)

#### 內容解密:
1. to_csv 方法將 DataFrame 儲存為 CSV 檔案
2. index=False 引數避免寫入索引列
3. read_csv 方法讀取 CSV 檔案內容
4. 自動推斷資料型別並建立新的 DataFrame

資料分組與聚合操作

pandas 提供強大的分組與聚合功能,能夠高效地進行資料分析。

分組聚合範例

# 建立範例 DataFrame
data = {'category': ['A', 'A', 'B', 'B'],
        'value': [10, 15, 20, 25]}
df = pd.DataFrame(data)

# 分組計算平均值
grouped = df.groupby('category')['value'].mean()
print(grouped)

#### 內容解密:
1. groupby 方法按 'category' 列進行分組
2.  'value' 列進行平均值計算
3. 傳回 Series 物件包含每組的計算結果
4. 索引為原始的分組類別標籤

pandas 函式庫使用與效能最佳化

資料處理基礎與進階應用

pandas 是 Python 中最強大的資料處理工具之一,提供高效的 DataFrame 結構和豐富的資料操作方法。本章將探討 pandas 的核心功能、進階應用以及效能最佳化技巧。

資料重塑與轉換

在資料分析過程中,經常需要對資料進行重塑和轉換以滿足不同的分析需求。pandas 提供了多種方法來實作這一點:

  1. pd.DataFrame.stack()pd.DataFrame.unstack()

    • 用於將資料從寬格式轉換為長格式,或反之。
    • 適用於多層索引的資料結構。
  2. pd.DataFrame.melt()

    • 將寬格式資料轉換為長格式。
    • 適合用於將多個欄位合併成兩個欄位(變數和值)。
  3. pd.DataFrame.pivot()pd.pivot_table()

    • 用於將長格式資料轉換為寬格式。
    • pivot_table() 支援聚合操作,適合處理重複索引的情況。
  4. pd.DataFrame.explode()

    • 將包含列表的欄位展開成多行。
    • 適合處理巢狀資料結構。

分組與視窗操作

分組操作是資料分析中的常見需求,pandas 提供了 groupby() 方法來實作:

  1. 基本分組操作

    • 使用 groupby() 對資料進行分組,並進行聚合計算。
    • 支援多欄位分組和自訂聚合函式。
  2. groupby().apply()

    • 對每個分組套用自訂函式。
    • 適合處理複雜的分組運算邏輯。
  3. 視窗操作

    • 使用 rolling()expanding() 進行視窗計算。
    • 適合進行時間序列分析和移動平均計算。

時間序列處理

pandas 提供了強大的時間序列處理功能:

  1. 時區處理

    • 使用 tz_localize()tz_convert() 處理不同時區的時間資料。
  2. 日期偏移

    • 使用 DateOffsets 對日期進行偏移運算。
    • 支援多種日期偏移規則,如工作日、月末等。
  3. 時間序列選取

    • 使用布林索引和 between_time() 選取特定時間範圍的資料。
  4. 重取樣

    • 使用 resample() 對時間序列進行重取樣。
    • 支援上取樣和下取樣,並可進行聚合計算。

效能最佳化技巧

  1. 避免使用 dtype=object

    • 物件型別會大幅降低運算效率,盡量使用數值型別或類別型別。
  2. 注意資料大小

    • 大型資料集需要更多的記憶體,必要時使用分塊處理或 Dask 等工具。
  3. 使用向量化運算

    • 向量化運算遠快於迴圈運算,盡量使用 pandas 內建的向量化函式。
  4. 避免修改原始資料

    • 修改原始資料可能導致意外錯誤,建議建立副本後再進行操作。
  5. 對低基數資料進行字典編碼

    • 對類別型資料進行字典編碼可以減少記憶體使用並提升效能。

pandas 生態系統

pandas 與其他 Python 資料科學函式庫緊密整合,形成了豐富的生態系統:

  1. 基礎函式庫

    • NumPy:提供底層數值運算支援。
    • PyArrow:支援高效的資料序列化和交換。
  2. 探索性資料分析

    • YData Profiling:提供自動化的資料探勘和報告功能。
  3. 資料驗證

    • Great Expectations:提供資料品質驗證和測試框架。
  4. 視覺化

    • Plotly:提供互動式視覺化功能。
    • PyGWalker:提供拖拽式的資料探索介面。
  5. 機器學習與科學計算

    • scikit-learn:提供機器學習演算法。
    • XGBoost:提供高效的梯度提升樹模型。
  6. 資料函式庫整合

    • DuckDB:提供高效的 OLAP 資料函式庫功能。
    • 其他 DataFrame 相容函式庫如 Ibis、Dask、Polars 和 cuDF 等,提供了不同的效能最佳化和分散式計算能力。

透過結合 pandas 的強大功能和其生態系統中的其他工具,可以大幅提升資料處理和分析的效率,為資料科學和分析工作提供堅實的基礎。

pandas 技術手冊:基礎與應用

pandas 是 Python 中用於建立和操作結構化資料的函式庫。所謂結構化資料,是指類別似試算表或資料函式庫中以列和欄呈現的表格資料。資料科學家、分析師、程式設計師和工程師等專業人士利用 pandas 來處理和轉換資料。

pandas 的適用範圍與限制

pandas 適用於處理「小資料」(可容納在單一機器記憶體中的資料)。然而,其語法和運算方式已啟發或被其他專案(如 PySpark、Dask 和 cuDF 等)採用。這些專案具有不同的目標,但有些可以擴充套件到處理大資料。因此,瞭解 pandas 的工作原理具有重要價值,因為其功能正成為與結構化資料互動的實際標準 API。

本文的目的與適用物件

本文包含大量範例,從簡單到進階不等。所有範例均以清晰、簡潔和現代化的 pandas 程式碼撰寫。「運作原理」部分對每個步驟進行詳細說明。通常,在「更多資訊」部分,會提供看似全新的範例。本文內容豐富,包含大量 pandas 程式碼。

雖然不是絕對必要,但建議讀者按順序閱讀本文。範例的結構設計為先使用小型、有針對性的範例介紹概念和功能,然後不斷擴充套件到更複雜的應用。

本文的章節安排

  1. pandas 基礎:介紹主要的 pandas 物件,包括 Series、DataFrame 和 Index。
  2. 選擇與指定:展示如何篩選已載入 pandas 資料結構中的資料。
  3. 資料型別:探討 pandas 的底層型別系統,這是一個快速演進的領域,瞭解不同型別及其區別至關重要。
  4. pandas I/O 系統:說明為什麼 pandas 長期以來一直是讀取和寫入多種儲存格式的流行工具。
  5. 演算法及其應用:介紹使用 pandas 資料結構進行計算的基礎。
  6. 視覺化:展示如何直接使用 pandas 進行繪圖,以及與 seaborn 函式庫的整合應用。
  7. 重塑 DataFrame:討論多種資料轉換和匯總的方法。
  8. Group By:展示如何分割和匯總 DataFrame 中的子集。
  9. 時間序列資料型別和演算法:介紹 pandas 中時間序列分析所依賴的日期/時間型別,並以實際資料進行示範。
  10. 一般使用/效能提示:討論使用者常見的陷阱,並展示慣用的解決方案。
  11. pandas 生態系統:介紹其他與 pandas 整合、擴充套件或互補的開源函式庫。

如何充分利用本文

  1. 下載本文的所有程式碼,儲存在 Jupyter Notebook 中。在閱讀每個範例時,在 Notebook 中執行每一步程式碼,並自行探索。
  2. 在瀏覽器的某個分頁中開啟 pandas 官方檔案(http://pandas.pydata.org/pandas-docs/stable/)。pandas 檔案是一份優秀的資源,包含超過 1,000 頁的資料。大多數 pandas 操作都有範例,通常在「參見」部分會有直接連結。

本文所需的環境

  • pandas 是 Python 的第三方套件,本文印刷時正在從 2.x 系列過渡到 3.x 系列。本文的範例應可在 pandas 2.0 及以上版本、Python 3.9 及以上版本中執行。
  • 本文的程式碼將使用 pandas、NumPy 和 PyArrow 函式庫。Jupyter Notebook 檔案也是視覺化和檢查程式碼的流行方式。所有這些函式庫都可透過 pip 或您選擇的套件管理器安裝。對於 pip 使用者,可以執行:
python -m pip install pandas numpy pyarrow notebook

詳細安裝步驟

  1. 登入或註冊 www.packt.com
  2. 選擇「支援」標籤。
  3. 點選「程式碼下載」。
  4. 在搜尋框中輸入書名,並按照螢幕上的指示操作。

本文的程式碼包也託管在 GitHub 上,網址為 https://github.com/WillAyd/Pandas-Cookbook-Third-Edition。如果程式碼有更新,將在現有的 GitHub 儲存函式庫中更新。

執行 Jupyter Notebook

建議透過執行 Jupyter Notebook 來學習本文的內容,這樣可以在閱讀範例時執行程式碼,並深入瞭解相關知識。