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 提供了多種方式來完成相同的操作,但其中一些方法可能效率極低,導致效能差異達到數量級以上。
本文內容簡介
- pandas 基礎: 介紹主要的 pandas 物件,包括 Series、DataFrame 和 Index。
- 選擇與指定: 說明如何篩選和操作已載入的資料。
- 資料型別: 探討 pandas 的型別系統,這是一個快速發展的領域。
- pandas I/O 系統: 展示 pandas 如何讀寫多種儲存格式。
- 演算法及其應用: 介紹如何使用 pandas 資料結構進行計算。
- 視覺化: 說明如何直接使用 pandas 進行繪圖,以及與 seaborn 函式庫的整合。
- 重塑 DataFrame: 討論多種資料轉換和匯總的方法。
- Group By: 展示如何分段和匯總 DataFrame 中的資料子集。
- 時間序列資料型別與演算法: 介紹 pandas 中用於時間序列分析的日期/時間型別。
- 一般使用/效能提示: 討論常見陷阱及慣用解決方案。
- pandas 生態系統: 介紹與 pandas 整合、擴充套件或互補的其他開源函式庫。
如何充分利用本文
- 下載所有程式碼(以 Jupyter Notebook 形式儲存),並在閱讀範例時執行每個程式碼步驟。
- 同時開啟 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:
- 安裝 Jupyter Notebook。
- 開啟終端機或命令提示字元。
- 切換到包含範例程式碼的目錄。
- 執行
jupyter notebook命令。 - 在瀏覽器中開啟顯示的網址,並開始執行範例程式碼。
程式碼解密:
此步驟將引導您逐步執行範例程式碼,並提供詳細的說明和註解,以幫助您理解每一段程式碼的作用和邏輯。
# 範例程式碼
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控制程式碼。例如:“您可能需要安裝xlwt或openpyxl來分別寫入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主要元件
pd.Series:一維的資料集合,可視為Excel中的一欄。與資料函式庫欄位類別似,pd.Series中的所有值必須具有相同的資料型別。
pd.DataFrame:二維的資料結構,可視為多個pd.Series物件的集合。每個pd.Series可以有不同的資料型別,因此pd.DataFrame可以儲存多種不同型別的資料。
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.Series 和 pd.DataFrame 提供索引功能,讓資料的存取與操作更加靈活高效。
自定義 Index
當建立 pd.Series 或 pd.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 時,可以同時指定 index 和 columns 引數來自定義列索引和欄位索引:
# 建立 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