返回文章列表

Pandas技術結構化資料處理

這份技術探討了 Python 中 pandas 函式庫的應用,涵蓋了從基礎概念到進階技巧的完整內容,包含 Series、DataFrame 和 Index 等核心資料結構的操作,以及資料選擇、指定、I/O、演算法、視覺化、重塑、分組與時間序列分析等實務應用。中提供了大量的程式碼範例和詳細的說明,並結合 Jupyter

資料科學 Python

pandas 提供了高效且直觀的資料結構,像是 Series 和 DataFrame,讓 Python 開發者能輕鬆處理結構化資料。這份不僅涵蓋了資料結構的建立與操作,也探討了資料型別的管理、I/O 系統的運用、演算法的應用以及視覺化的技巧。此外,也針對 DataFrame 的重塑、分組、時間序列資料的處理,以及效能最佳化等進階主題提供了實務解法。對於不同程度的 pandas 使用者,本文都提供了相應的學習資源,從基礎概念到進階應用,都能找到有價值的資訊。

在開始使用 pandas 之前,建議先安裝 Jupyter Notebook,這是一個互動式的程式碼開發環境,可以更方便地執行和測試程式碼。安裝完成後,在終端機或命令提示字元中輸入 jupyter notebook 即可啟動。接著,可以新建一個 Python 3 筆記本,或開啟現有的 .ipynb 檔案。此外,Google 和 Microsoft 也提供免費的雲端筆記本環境,預先安裝了 pandas 等常用函式庫。本文所有程式碼範例都根據 pandas 2.0 以上版本,Python 3.9 以上版本,並使用了 NumPy、PyArrow 等相關函式庫。

pandas 技術:結構化資料處理的利器

pandas 是 Python 中用於建立和操作結構化資料的函式庫。所謂結構化資料,指的是類別似試算表或資料函式庫中的表格資料,即以列和欄形式組織的資料。無論是資料科學家、分析師、程式設計師還是工程師,都能利用 pandas 來有效地處理和分析他們的資料。

pandas 的應用範圍與限制

雖然 pandas 主要適用於「小資料」(能夠在單一機器記憶體中處理的資料),但其語法和操作方式已經被其他專案如 PySpark、Dask 和 cuDF 等採用或啟發。這些專案雖然目標各異,但有些能夠擴充套件到大資料處理。因此,理解 pandas 的工作原理具有重要的價值,因為其功能正逐漸成為與結構化資料互動的標準 API。

本文目的與適用物件

本文包含了大量從簡單到進階的範例,所有範例均致力於使用清晰、簡潔且現代化的 pandas 程式碼撰寫。「運作原理」章節對每個步驟進行了極為詳細的說明,而「更多內容」部分往往會提供看似全新的範例。本文內容豐富,包含大量 pandas 程式碼範例。

本文適合不同程度的讀者,從初學者到日常使用者都能受益。即使是經常使用 pandas 的使用者,也需要透過學習慣用的 pandas 程式碼來提高效率。pandas 提供了多種方式來完成相同的操作,但其中一些方法可能效率極低,導致效能差異達到數量級以上。

本文內容簡介

  1. pandas 基礎: 介紹主要的 pandas 物件,包括 Series、DataFrame 和 Index。
  2. 選擇與指定: 說明如何篩選和操作已載入的資料。
  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 形式儲存),並在閱讀範例時執行每個程式碼步驟。
  2. 同時開啟 pandas 官方檔案(http://pandas.pydata.org/pandas-docs/stable/),這是一個包含超過 1,000 頁內容的優秀資源。

系統需求

  • pandas 版本:至少 2.0
  • Python 版本:3.9 及以上
  • 其他函式庫:NumPy、PyArrow
  • Jupyter Notebook 用於視覺化和檢查程式碼

可透過 pip 安裝所需函式庫:

python -m pip install pandas numpy pyarrow notebook

範例程式碼下載

執行 Jupyter Notebook

建議在閱讀本文時同時執行 Jupyter Notebook,以便更深入地理解內容。

如何執行 Jupyter Notebook:

  1. 安裝 Jupyter Notebook。
  2. 開啟終端機或命令提示字元。
  3. 切換到包含範例程式碼的目錄。
  4. 執行 jupyter notebook 命令。
  5. 在瀏覽器中開啟顯示的網址,並開始執行範例程式碼。

程式碼解密:

此步驟將引導您逐步執行範例程式碼,並提供詳細的說明和註解,以幫助您理解每一段程式碼的作用和邏輯。

# 範例程式碼
import pandas as pd

# 建立一個簡單的 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35]}
df = pd.DataFrame(data)

# 列印 DataFrame
print(df)

內容解密:

此段程式碼首先匯入 pandas 函式庫,並建立一個名為 data 的字典,字典中包含兩個鍵值對:‘Name’ 和 ‘Age’。然後,使用 pd.DataFrame() 函式將字典轉換為 DataFrame 物件。最後,列印出這個 DataFrame。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Pandas技術結構化資料處理

package "資料視覺化流程" {
    package "資料準備" {
        component [資料載入] as load
        component [資料清洗] as clean
        component [資料轉換] as transform
    }

    package "圖表類型" {
        component [折線圖 Line] as line
        component [長條圖 Bar] as bar
        component [散佈圖 Scatter] as scatter
        component [熱力圖 Heatmap] as heatmap
    }

    package "美化輸出" {
        component [樣式設定] as style
        component [標籤註解] as label
        component [匯出儲存] as export
    }
}

load --> clean --> transform
transform --> line
transform --> bar
transform --> scatter
transform --> heatmap
line --> style --> export
bar --> label --> export

note right of scatter
  探索變數關係
  發現異常值
end note

@enduml

圖表翻譯: 此圖示展示了從建立字典到轉換為 DataFrame,最後列印輸出的流程。字典中的資料被轉換為結構化的表格形式,便於進一步的操作和分析。

前言

在安裝完Jupyter notebook後,開啟命令提示字元(在Windows的搜尋列輸入cmd,或在Mac或Linux上開啟終端機),然後輸入:

jupyter notebook

無需在主目錄下執行此命令,可以從任何位置執行,瀏覽器中的內容將反映該位置。雖然我們已經啟動了Jupyter Notebook程式,但尚未實際啟動單個筆記本進行Python開發。要做到這一點,可以點選頁面右側的New按鈕,這將下拉列出所有可用的核心。如果是全新安裝,那麼只有一個核心可用(Python 3)。選擇Python 3核心後,將在瀏覽器中開啟一個新標籤頁,可以開始編寫Python程式碼。

當然,也可以開啟先前建立的筆記本而不是開始一個新的。要這樣做,請透過Jupyter Notebook瀏覽器首頁提供的檔案系統導航並選擇要開啟的筆記本。所有Jupyter Notebook檔案都以.ipynb結尾。

或者,可以使用雲端提供商的筆記本環境。Google和Microsoft都提供免費的筆記本環境,預先載入了pandas。

本文使用的慣例

本文中使用了多種文字慣例。

程式碼在文中

表示文字中的程式碼詞、資料函式庫表名、資料夾名稱、檔名、副檔名、路徑名、虛擬URL、使用者輸入和Twitter/X控制程式碼。例如:“您可能需要安裝xlwtopenpyxl來分別寫入XLS或XLSX檔案。”

程式碼區塊

程式碼區塊設定如下:

import pandas as pd
import numpy as np
movies = pd.read_csv("data/movie.csv")
movies

粗體

表示重要的詞語,或在螢幕上看到的詞語。例如:“從管理面板中選擇系統資訊。”

斜體

表示在寫作上下文中具有額外重要性的術語。

重要注意事項

重要注意事項顯示如下。

每個配方(recipe)的假設

應該假設在每個配方的開始,pandas、NumPy、PyArrow和Matplotlib已經匯入到名稱空間中:

import numpy as np
import pyarrow as pa
import pandas as pd

資料集描述

本文使用了大約兩打資料集。在完成配方中的步驟時,擁有每個資料集的背景資訊非常有幫助。每個資料集的詳細描述可以在https://github.com/WillAyd/Pandas-Cookbook-Third-Edition找到的dataset_descriptions Jupyter Notebook檔案中找到。對於每個資料集,將有列的列表,每個列的資訊,以及有關如何取得資料的註解。

章節

在本文中,您將發現幾個頻繁出現的標題。

如何做

本文包含遵循配方所需的步驟。

它是如何工作的

本文通常由前一節的詳細解釋組成。

還有更多…

本文由關於配方的額外資訊組成,以便使您對配方更加了解。

聯絡我們

始終歡迎我們的讀者提供反饋。

一般反饋

如果您對本文的任何方面有疑問,請在您的郵件主題中提及書名,然後傳送電子郵件至[email protected]

勘誤表

盜版

成為作者

留下評論!

取得免費PDF副本

感謝您購買這本文! 您喜歡在移動中閱讀,但無法隨身攜帶印刷書嗎? 您的電子書購買與您選擇的裝置不相容嗎? 優惠還不止於此,您還可以獲得獨家折扣、新聞通訊和每天傳送到您收件箱中的優質免費內容。 按照以下簡單步驟即可獲得這些優惠: 2. 提交您的購買證明。 3. 就這樣!我們將把您的免費PDF和其他優惠直接傳送到您的電子郵件中。

pandas基礎介紹

pandas函式庫是處理結構化資料的強大工具。結構化資料是指儲存在表格中的資料,如CSV檔案、Excel試算表或資料函式庫表格。非結構化資料則包含自由格式的文字、影像、聲音或影片。如果您經常處理結構化資料,pandas將成為您的得力助手。

pandas主要元件

  1. pd.Series:一維的資料集合,可視為Excel中的一欄。與資料函式庫欄位類別似,pd.Series中的所有值必須具有相同的資料型別。

  2. pd.DataFrame:二維的資料結構,可視為多個pd.Series物件的集合。每個pd.Series可以有不同的資料型別,因此pd.DataFrame可以儲存多種不同型別的資料。

  3. pd.Index:用於標識和選取資料的索引,不僅可用於查詢資料,還可用於合併表格等操作。

匯入pandas

大多數使用者會使用匯入別名pd來參照pandas函式庫。匯入pandas和NumPy的程式碼如下:

import pandas as pd
import numpy as np

許多範例也會使用到PyArrow函式庫,假設匯入別名為pa

import pyarrow as pa

建立pd.Series

pd.Series是一維陣列與索引的組合。以下是幾種建立pd.Series的方法:

使用序列值建立

pd.Series([0, 1, 2])

輸出結果:

0    0
1    1
2    2
dtype: int64

指定資料型別

您可以透過dtype引數指定資料型別,以節省記憶體或確保與其他系統的相容性。

pd.Series(range(3), dtype="int8")

輸出結果:

0    0
1    1
2    2
dtype: int8

為pd.Series命名

pd.Series(["apple", "banana", "orange"], name="fruit")

輸出結果:

0      apple
1     banana
2     orange
Name: fruit, dtype: object

內容解密:

  • pd.Series([0, 1, 2])建立了一個包含整數0到2的Series,pandas自動推斷資料型別為int64
  • dtype="int8"指定了資料型別為8位元整數,節省記憶體。
  • name="fruit"為Series命名為"fruit",便於識別。

建立pd.DataFrame

pd.DataFrame是pandas中最常用的物件。以下是幾種建立pd.DataFrame的方法:

使用二維序列

pd.DataFrame([
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
])

輸出結果:

   0  1  2
0  0  1  2
1  3  4  5
2  6  7  8

指定欄位名稱

pd.DataFrame([
    [1, 2],
    [4, 8],
], columns=["col_a", "col_b"])

輸出結果:

   col_a  col_b
0      1      2
1      4      8

使用字典建立

pd.DataFrame({
    "first_name": ["Jane", "John"],
    "last_name": ["Doe", "Smith"],
})

輸出結果:

  first_name last_name
0       Jane        Doe
1       John      Smith

使用pd.Series建立

ser1 = pd.Series(range(3), dtype="int8", name="int8_col")
ser2 = pd.Series(range(3), dtype="int16", name="int16_col")
pd.DataFrame({ser1.name: ser1, ser2.name: ser2})

輸出結果:

   int8_col  int16_col
0         0          0
1         1          1
2         2          2

內容解密:

  • 使用二維列表建立DataFrame,pandas自動生成列索引和行索引。
  • columns引數用於指定欄位名稱,使資料選取更直觀。
  • 使用字典建立DataFrame,字典的鍵成為欄位名稱,值成為對應欄位的資料。
  • 可以直接使用pd.Series物件建立DataFrame,提供更靈活的資料來源。

pandas 資料結構基礎:Index 與屬性檢視

在 pandas 中,pd.Index 扮演著重要的角色,它負責為 pd.Seriespd.DataFrame 提供索引功能,讓資料的存取與操作更加靈活高效。

自定義 Index

當建立 pd.Seriespd.DataFrame 時,pandas 會自動生成一個預設的 pd.RangeIndex,但我們可以透過 index 引數來指定自定義的索引標籤。

自定義 Series Index

建立 pd.Series 時,可以透過 index 引數指定自定義的索引標籤:

import pandas as pd

# 建立自定義 Index
index = pd.Index(["dog", "cat", "human"], name="animal")

# 建立 Series 並指定自定義 Index
ser = pd.Series([4, 4, 2], name="num_legs", index=index)

print(ser)

輸出結果:

animal
dog      4
cat      4
human    2
Name: num_legs, dtype: int64

自定義 DataFrame Index 與 Columns

建立 pd.DataFrame 時,可以同時指定 indexcolumns 引數來自定義列索引和欄位索引:

# 建立 DataFrame 並指定自定義 Index 與 Columns
df = pd.DataFrame([
    [24, 180, "red"],
    [42, 166, "blue"],
], columns=["age", "height_cm", "favorite_color"], index=pd.Index(["Jack", "Jill"], name="person"))

print(df)

輸出結果:

       age  height_cm favorite_color
person                               
Jack    24        180             red
Jill    42        166            blue

Series 與 DataFrame 的屬性檢視

Series 屬性

pd.Series 提供多種屬性來檢視資料的基本資訊:

  • dtype:檢視 Series 的資料型別。
  • name:檢視 Series 的名稱。
  • index:檢視 Series 的索引。
  • shape:檢視 Series 的形狀(元素數量)。
  • size:檢視 Series 的元素數量。
print(ser.dtype)       # 輸出:int64
print(ser.name)        # 輸出:num_legs
print(ser.index)       # 輸出:Index(['dog', 'cat', 'human'], dtype='object', name='animal')
print(ser.shape)       # 輸出:(3,)
print(ser.size)        # 輸出:3
print(len(ser))        # 輸出:3

DataFrame 屬性

pd.DataFrame 提供多種屬性來檢視資料的基本資訊:

  • dtypes:檢視各欄位的資料型別。
  • index:檢視 DataFrame 的列索引。
  • columns:檢視 DataFrame 的欄位索引。
  • shape:檢視 DataFrame 的形狀(列數和欄數)。
  • size:檢視 DataFrame 的元素總數。
print(df.dtypes)       # 輸出各欄位的資料型別
print(df.index)        # 輸出列索引
print(df.columns)      # 輸出欄位索引
print(df.shape)        # 輸出形狀 (2, 3)
print(df.size)         # 輸出元素總數 6
print(len(df))         # 輸出列數 2