Pandas 作為 Python 資料科學領域的核心函式庫,其提供的資料輸入輸出與演算法應用是資料分析的根本。本文從實務角度出發,探討如何使用 Pandas 讀取不同格式的資料,包含 HTML 表格和 Pickle 格式,並簡述第三方函式庫的擴充性。同時,文章也深入淺出地介紹 Pandas 的核心演算法,包含基本算術運算、聚合分析以及索引對齊等關鍵技術,幫助讀者建立紮實的 Pandas 資料處理能力,以應對各種資料分析挑戰。理解這些核心概念與技巧,能讓開發者更有效率地運用 Pandas 進行資料處理與分析,並提升程式碼的效能與可讀性。

資料輸入輸出系統的最佳實踐

在資料分析的過程中,資料的輸入輸出是至關重要的環節。Pandas 提供了強大的資料讀寫功能,支援多種資料格式,包括 CSV、Excel、HTML、Pickle 等。在本章中,我們將深入探討 Pandas 的資料輸入輸出系統,並介紹一些最佳實踐。

HTML 表格的讀取

Pandas 提供了 read_html 函式,可以輕鬆地從 HTML 檔案中讀取表格資料。這個函式非常有用,因為許多網站都使用 HTML 表格來呈現資料。

import pandas as pd

url = "https://en.wikipedia.org/wiki/The_Beatles_discography"
dfs = pd.read_html(url, match="List of studio albums", header=1, na_values=["—"])
print(f"Number of tables returned was: {len(dfs)}")
print(dfs[0].filter(regex=r"Title|UK|AUS|CAN").head())

程式碼解析

此程式碼片段示範瞭如何使用 read_html 函式從維基百科頁面中讀取表格資料。我們指定了 match 引數來篩選包含特定文字的表格,並使用 header=1 來忽略多重索引的第一層。此外,我們還使用了 na_values=["—"] 來將特定的缺失值表示法轉換為 NaN。

  flowchart TD
 A[開始讀取 HTML] --> B{檢查表格內容}
 B -->|找到匹配表格| C[讀取表格資料]
 B -->|未找到匹配表格| D[傳回空列表]
 C --> E[處理表格資料]
 E --> F[輸出 DataFrame]

圖表翻譯

此圖示展示了使用 read_html 函式讀取 HTML 表格資料的流程。首先,函式會檢查 HTML 內容以尋找匹配的表格。如果找到匹配的表格,則讀取其內容並進行處理,最終輸出為 DataFrame。如果未找到匹配的表格,則傳回空列表。

Pickle 格式的使用

Pickle 是 Python 的內建序列化格式,可以用於儲存和讀取 Pandas 物件。然而,由於安全性和相容性問題,建議僅在必要時使用 Pickle 格式。

import pandas as pd
from collections import namedtuple

Member = namedtuple("Member", ["first", "last", "birth"])
ser = pd.Series([
 Member("Paul", "McCartney", 1942),
 Member("John", "Lennon", 1940),
 Member("Richard", "Starkey", 1940),
 Member("George", "Harrison", 1943),
])

buf = io.BytesIO()
ser.to_pickle(buf)
buf.seek(0)
ser_loaded = pd.read_pickle(buf)
print(ser_loaded)

程式碼解析

此範例示範瞭如何使用 Pickle 格式儲存和讀取包含 namedtuple 的 Pandas Series。首先,我們建立了一個包含 namedtuple 物件的 Series,然後使用 to_pickle 方法將其儲存到 BytesIO 緩衝區。接著,我們使用 read_pickle 方法從緩衝區中讀取資料,並輸出結果。

第三方資料輸入輸出函式庫

除了 Pandas 內建的資料輸入輸出功能外,還有許多第三方函式庫可供使用,例如 pandas-gbq、AWS SDK for pandas 和 Snowflake Connector for Python 等。這些函式庫提供了與各種資料來源和目標進行資料交換的功能。

資料演算法的應用

在資料分析中,演算法的應用是非常重要的。Pandas 提供了許多常見的資料演算法,例如基本算術運算、聚合運算、轉換運算等。這些演算法可以幫助我們高效地處理和分析資料。

在本章中,我們將介紹以下主題:

  • 基本的 Series 和 DataFrame 算術運算
  • 聚合運算
  • 轉換運算
  • Map 和 Apply 運算
  • 總結統計
  • Binning 演算法
  • One-hot 編碼

這些主題將幫助讀者深入瞭解 Pandas 的資料演算法,並學會如何在實際應用中使用它們。

pandas演算法應用基礎

在探討pandas演算法時,最基礎的結構是pd.Series。本章節將介紹基本的算術運算,包括加法、減法、乘法和除法,並展示pandas如何以向量化方式高效執行這些運算。

基本算術運算

pandas支援使用Python內建運算元(+、-、*、/)進行基本算術運算。同時,pandas也提供了對應的方法(pd.Series.addpd.Series.subpd.Series.mulpd.Series.div)來執行這些運算。

使用內建運算元

首先,建立一個簡單的pd.Series

ser = pd.Series(range(3), dtype=pd.Int64Dtype())
print(ser)

輸出:

  0    0
1    1
2    2
dtype: Int64

使用內建運算元進行算術運算:

print(ser + 42)  # 加法
print(ser - 42)  # 減法
print(ser * 2)   # 乘法
print(ser / 2)   # 除法

輸出:

  0    42
1    43
2    44
dtype: Int64

0    -42
1    -41
2    -40
dtype: Int64

0    0
1    2
2    4
dtype: Int64

0    0.0
1    0.5
2    1.0
dtype: Float64

使用pandas方法

pandas提供的方法允許更靈活的運算,特別是在處理缺失值時:

ser1 = pd.Series([1., 2., 3.], dtype=pd.Float64Dtype())
ser2 = pd.Series([4., pd.NA, 6.], dtype=pd.Float64Dtype())

print(ser1.add(ser2))  # 使用add方法進行加法
print(ser1.add(ser2, fill_value=0.))  # 處理缺失值

輸出:

  0     5.0
1    <NA>
2     9.0
dtype: Float64

0    5.0
1    2.0
2    9.0
dtype: Float64

索引對齊

當兩個pd.Series進行運算時,pandas會根據索引進行對齊。這意味著只有索引相同的元素才會被運算。

ser1 = pd.Series(range(3), dtype=pd.Int64Dtype())
ser2 = pd.Series(range(3), dtype=pd.Int64Dtype())
print(ser1 + ser2)  # 索引相同

輸出:

  0    0
1    2
2    4
dtype: Int64

若索引不同,結果會根據索引對齊:

ser3 = pd.Series([2, 4], dtype=pd.Int64Dtype())
print(ser1 + ser3)  # 索引部分相同

輸出:

  0       2
1       5
2    <NA>
dtype: Int64

索引不匹配的情況

當兩個pd.Series的索引完全不同時,結果會包含大量缺失值:

ser4 = pd.Series([2, 4, 8], index=[1, 2, 3], dtype=pd.Int64Dtype())
print(ser1 + ser4)  # 索引完全不同

輸出:

  0    <NA>
1       3
2       6
3    <NA>
dtype: Int64

索引重複的情況

若某個pd.Series的索引有重複值,對齊時會產生多個對應結果:

ser5 = pd.Series([2, 4, 8], index=[0, 1, 1], dtype=pd.Int64Dtype())
print(ser1 + ser5)  # 索引有重複值

輸出:

  0       2
1       5
1       9
2    <NA>
dtype: Int64

這種行為類別似於SQL中的FULL OUTER JOIN操作。

資料函式庫類別比

上述行為可以用SQL中的FULL OUTER JOIN來類別比:

WITH ser1 AS (
  SELECT * FROM (
    VALUES
      (0, 0),
      (1, 1),
      (2, 2)
  ) AS t(index, val1)
),
ser5 AS (
  SELECT * FROM (
    VALUES
      (0, 2),
      (1, 4),
      (1, 8)
  ) AS t(index, val2)
)
SELECT * FROM ser1 FULL OUTER JOIN ser5 USING(index);

結果:

  index | val1 | val2
------+------+------
    0 |    0 |    2
    1 |    1 |    4
    1 |    1 |    8
    2 |    2 | 

這展示了pandas在處理不同索引時的對齊邏輯。

  flowchart TD
    A[建立pd.Series] --> B{檢查索引}
    B -->|索引相同| C[直接運算]
    B -->|索引不同| D[索引對齊]
    D --> E[處理缺失值]
    C --> F[傳回結果]
    E --> F

圖表翻譯:

此圖表展示了pandas在進行pd.Series算術運算時的流程。首先,建立pd.Series物件,接著檢查索引是否相同。若索引相同,直接進行運算;若索引不同,則進行索引對齊並處理可能產生的缺失值。最終傳回運算結果。這個流程清晰地說明瞭pandas如何處理不同索引情況下的算術運算。

技術細節探討

  1. 向量化運算:pandas利用向量化運算提升效能,避免了Python層級的迴圈。
  2. 索引對齊:在兩個pd.Series運算時,pandas會根據索引標籤進行對齊。
  3. 缺失值處理:使用fill_value引數可以有效處理缺失值。
  4. SQL類別比:多索引情況下的運算行為類別似於SQL的FULL OUTER JOIN。

效能最佳化建議

  1. 確保索引資料型別一致以提升運算效率
  2. 使用fill_value引數處理缺失值
  3. 預先對齊索引以避免不必要的計算開銷
  4. 使用向量化運算而非迴圈處理

Pandas 資料運算與聚合分析

Pandas 是 Python 中強大的資料分析工具,其在資料運算與聚合分析方面提供了豐富的功能。本章將深入探討 Pandas 中的資料運算與聚合分析技術,包括基本運算、資料對齊以及聚合函式的使用。

基本資料運算

Pandas 中的 pd.Seriespd.DataFrame 物件支援基本的數學運算,如加法、減法、乘法和除法。這些運算可以與純量值進行,也可以與其他 pd.Seriespd.DataFrame 物件進行。

與純量運算

import pandas as pd
import numpy as np

# 建立一個包含隨機數字的 DataFrame
np.random.seed(42)
df = pd.DataFrame(
    np.random.randn(3, 3),
    columns=["col1", "col2", "col3"],
    index=["row1", "row2", "row3"],
).convert_dtypes(dtype_backend="numpy_nullable")

print("原始 DataFrame:")
print(df)

# 與純量進行加法運算
print("\n與純量1進行加法運算:")
print(df + 1)

# 與純量進行乘法運算
print("\n與純量2進行乘法運算:")
print(df * 2)

與 Series 運算

當對 pd.DataFramepd.Series 進行運算時,Pandas 會根據索引標籤進行對齊。

# 建立一個 Series,索引標籤與 DataFrame 的欄位名稱相符
ser = pd.Series(
    [20, 10, 0],
    index=["col1", "col2", "col3"],
    dtype=pd.Int64Dtype(),
)

print("\n與 Series 進行加法運算(按欄位對齊):")
print(df + ser)

控制對齊方式

使用 axis 引數可以控制 pd.Seriespd.DataFrame 之間的對齊方式。

# 建立一個 Series,索引標籤與 DataFrame 的列標籤相符
ser = pd.Series(
    [20, 10, 0, 42],
    index=["row1", "row2", "row3", "row4"],
    dtype=pd.Int64Dtype(),
)

print("\n與 Series 進行加法運算(按列對齊):")
print(df.add(ser, axis=0))

兩個 DataFrame 之間的運算

兩個 pd.DataFrame 之間的運算同樣遵循索引對齊的原則。

# 建立另一個 DataFrame
np.random.seed(42)
df2 = pd.DataFrame(np.random.randn(3, 3))

print("\n兩個 DataFrame 相加:")
print(df + df2)

資料聚合

資料聚合(Aggregations)是將多個值簡化為單一值的過程。Pandas 提供了多種內建的聚合函式,如 meanstdminmaxsum 等。

使用聚合函式

# 建立一個包含隨機數字的 Series
np.random.seed(42)
ser = pd.Series(np.random.rand(10_000), dtype=pd.Float64Dtype())

# 計算各種聚合值
print("數量:", ser.count())
print("平均值:", ser.mean())
print("標準差:", ser.std())
print("最小值:", ser.min())
print("最大值:", ser.max())
print("總和:", ser.sum())

使用 agg 方法

agg 方法允許同時進行多種聚合運算。

# 使用 agg 方法進行多種聚合運算
print(ser.agg(["min", "max", "mean", "std"]))

Mermaid 圖表:資料運算流程

  flowchart TD
    A[開始] --> B{資料型別檢查}
    B -->|Series| C[進行 Series 運算]
    B -->|DataFrame| D[進行 DataFrame 運算]
    C --> E[結果輸出]
    D --> E
    E --> F[結束]

圖表翻譯:

此圖表展示了 Pandas 資料運算的基本流程。首先檢查輸入資料的型別,如果是 Series 則進行相應的運算,如果是 DataFrame 則進行對應的運算。最終輸出運算結果並結束流程。