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.add
、pd.Series.sub
、pd.Series.mul
、pd.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如何處理不同索引情況下的算術運算。
技術細節探討
- 向量化運算:pandas利用向量化運算提升效能,避免了Python層級的迴圈。
- 索引對齊:在兩個
pd.Series
運算時,pandas會根據索引標籤進行對齊。 - 缺失值處理:使用
fill_value
引數可以有效處理缺失值。 - SQL類別比:多索引情況下的運算行為類別似於SQL的FULL OUTER JOIN。
效能最佳化建議
- 確保索引資料型別一致以提升運算效率
- 使用
fill_value
引數處理缺失值 - 預先對齊索引以避免不必要的計算開銷
- 使用向量化運算而非迴圈處理
Pandas 資料運算與聚合分析
Pandas 是 Python 中強大的資料分析工具,其在資料運算與聚合分析方面提供了豐富的功能。本章將深入探討 Pandas 中的資料運算與聚合分析技術,包括基本運算、資料對齊以及聚合函式的使用。
基本資料運算
Pandas 中的 pd.Series
和 pd.DataFrame
物件支援基本的數學運算,如加法、減法、乘法和除法。這些運算可以與純量值進行,也可以與其他 pd.Series
或 pd.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.DataFrame
和 pd.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.Series
和 pd.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 提供了多種內建的聚合函式,如 mean
、std
、min
、max
、sum
等。
使用聚合函式
# 建立一個包含隨機數字的 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
則進行對應的運算。最終輸出運算結果並結束流程。