返回文章列表

Pandas 基礎與應用:資料處理實戰

這篇文章深入淺出地介紹了 Python 資料處理函式庫 Pandas 的基礎與應用,涵蓋了核心概念、資料結構、常用操作以及實務技巧,適合初學者和日常使用者。文章從 Pandas 的核心物件 Series 和 DataFrame

資料科學 Python

Pandas 作為 Python 生態系統中不可或缺的資料處理工具,廣泛應用於資料清洗、轉換、分析等場景。理解其核心物件 Series 和 DataFrame 的運作機制,對於高效處理結構化資料至關重要。本文將從 Pandas 的基礎概念出發,逐步介紹 Series 和 DataFrame 的建立、操作以及常用方法,並結合實際案例說明如何應用 Pandas 進行資料處理。同時,還會探討一些進階技巧和效能最佳化策略,幫助讀者更深入地掌握 Pandas 的應用。

pandas 基礎與應用

pandas 是一個強大的 Python 函式庫,專門用於建立和操作結構化資料。結構化資料指的是表格式的資料,例如在試算表或資料函式庫中所見的行和列。資料科學家、分析師、程式設計師和工程師都在利用它來處理和轉換資料。

儘管 pandas 主要用於「小資料」(即能夠在單一機器記憶體中處理的資料),但其語法和操作已被其他專案如 PySpark、Dask 和 cuDF 所採用或啟發。這些專案有不同的目標,但其中一些可以擴充套件到處理大資料。因此,理解 pandas 的運作方式具有價值,因為其功能正在成為處理結構化資料的事實標準應用程式介面(API)。

玄貓(BlackCat)自 2018 年起便是 pandas 函式庫的核心維護者之一。在這段期間,玄貓(BlackCat)有幸參與並與其他開源專案合作,包括但不限於 Arrow、NumPy 和 Cython。

此外,玄貓(BlackCat)還從事顧問工作,利用相同的生態系統幫助客戶制定資料策略、實施流程和模式,並培訓員工保持在不斷變化的分析曲線前沿。玄貓(BlackCat)深信開源工具提供的自由價值,並已證明這一價值對許多公司。

本文適合讀者

本文包含大量範例,從簡單到高階不等。所有範例都致力於使用清晰、簡潔且現代的 pandas 程式碼來編寫。每個「如何運作」部分都包含對每個步驟詳細說明的描述。經常在「此外……」部分中,你會看到看似完全新的範例。本文內容豐富且包含大量的 pandas 程式碼。

雖然不是嚴格要求,但讀者建議按照順序閱讀本文。範例是以介紹概念和功能開始,使用非常小且有針對性的示例,但會不斷擴充套件到更複雜的應用。

由於範例複雜程度各異,本文對初學者和日常使用者都有幫助。玄貓(BlackCat)發現即使那些經常使用 pandas 的人也需要接觸到經典的 pandas 程式碼才能掌握它。這在一定程度上是由 pandas 提供的廣泛性造成的。幾乎總是有多種方法來完成相同操作,這可能會讓使用者獲得他們想要的結果,但方式非常低效。

此書唯一真正前提是對 Python 的基本瞭解。假設讀者熟悉 Python 中所有常見內建資料容器,例如列表、集合、字典和元組。

本文涵蓋內容

  • 第 1 章:pandas 基礎:介紹主要 pandas 物件,即 Series、DataFrames 和 Index。
  • 第 2 章:選擇與指定:展示如何篩選已載入至任何 pandas 資料結構中的資料。
  • 第 3 章:資料型別:探討 pandas 底層的型別系統。這是一個快速演變且將繼續演變的領域,因此瞭解型別及其區別是寶貴的資訊。
  • 第 4 章:pandas I/O 系統:展示為什麼 pandas 長期以來是讀取和寫入各種儲存格式的一個受歡迎工具。
  • 第 5 章:演算法及其應用:介紹使用 pandas 資料結構進行計算的基礎。
  • 第 6 章:視覺化:展示如何直接使用 pandas 用於繪圖以及如何與與之良好整合的 seaborn 函式庫搭配使用。
  • 第 7 章:重塑 DataFrames:討論透過 pd.DataFrame 快速且健壯地轉換和摘要資料。
  • 第 8 章:群組分析:展示如何分割並總結包含在 pd.DataFrame 中的一部分資料。
  • 第 9 章:時間資料型別和演算法:介紹日期/時間型別,這些型別是時間序列分析所依賴的基礎。
  • 第 10 章:一般使用/效能提示:說明使用者在使用 pandas時遇到的一些常見陷阱以及經典解決方案。
  • 第 11 章:pandas 生態系統:討論其他開源函式庫如何整合、擴充套件或補充 pandas。

操作指引

以下是一些提示來幫助你充分利用本文:

  1. 下載所有程式碼並將其儲存在 Jupyter Notebook 中。逐步閱讀每個範例並執行程式碼。確保在執行程式碼時進行自己的探索。
  2. 在瀏覽器標籤中開啟官方 pandas 說明檔案(http://pandas.pydata.org/pandas-docs/stable/)。pandas 說明檔案是一個優秀的資源,包含超過1,000頁內容。
  3. 其他開源函式庫如 PySpark、Dask 和 cuDF 提供了擴充套件功能以處理大規模資料集。

需求

pandas 是 Python 語言的一個第三方套件,截至本文出版時正從2.x系列轉移到3.x系列。本文中的範例應該能夠執行於最低版本為2.0的pandas以及Python版本3.9及以上。

本文中的程式碼將使用 pandas、NumPy 和 PyArrow 函式庫。Jupyter Notebook 檔案也是檢視和檢查程式碼的一種流行方式。所有這些函式庫都可以透過以下命令安裝:

python -m pip install pandas numpy pyarrow notebook

在 Jupyter Notebook 中執行

建議你將 Jupyter Notebook 啟動並執行以便隨著閱讀範例來執行程式碼。跟隨著電腦上的操作可以讓你更深入地理解而不僅僅是閱讀書籍。

內容解密:

  • 下載 Jupyter Notebook:首先需要從網上下載 Jupyter Notebook 檔案並解壓縮。
  • 啟動 Jupyter Notebook:開啟終端機或命令提示字元輸入 jupyter notebook 指令以啟動 Jupyter Notebook 。
  • 逐步執行程式碼:在 Jupyter Notebook 中逐步執行書籍中的每一段程式碼。
  • 進行自己的探索:不要僅僅按照書籍中的步驟進行操作,可以嘗試修改程式碼進行自己的探索。
  • 深入理解:透過實際操作來加深對程式碼及其背後原理的理解。

透過以上步驟,你將能夠充分利用本文來學習和掌握 pandas 的強大功能。

使用 Jupyter Notebook 與 Pandas 進行 Python 資料分析

Jupyter Notebook 是一個強大的開源工具,能夠讓我們在瀏覽器中進行互動式的資料分析。它支援多種程式語言,但以 Python 為最常用。Pandas 是 Python 中最流行的資料處理函式庫之一,能夠方便地進行資料操作和分析。以下是如何安裝和使用 Jupyter Notebook 與 Pandas 的詳細。

安裝與啟動 Jupyter Notebook

首先,我們需要安裝 Jupyter Notebook。可以透過以下命令來安裝:

pip install notebook

安裝完成後,開啟命令提示字元(Windows 的搜尋列中輸入 cmd,或在 Mac 和 Linux 中開啟終端機),然後輸入以下命令來啟動 Jupyter Notebook:

jupyter notebook

這個命令可以從任何位置執行,而不僅僅是從家目錄。啟動後,瀏覽器會自動開啟 Jupyter Notebook 的首頁面。

此圖示

在首頁面上,你可以看到當前目錄下的所有檔案。你可以點選 New 按鈕來建立一個新的 Notebook,並選擇所需的核心(Kernel)。如果是剛剛安裝的環境,通常只會有一個 Python 3 的內核可用。

選擇 Python 3 核心後,會在新的瀏覽器標籤頁中開啟一個新的 Notebook,你可以在此開始撰寫和執行 Python 程式碼。

使用 Pandas 語法

在新的 Notebook 中,我們可以開始使用 Pandas 處理資料。以下是一些基本操作:

import pandas as pd
import numpy as np

# 讀取 CSV 檔案
movies = pd.read_csv("data/movie.csv")
movies

內容解密:

  • 匯入模組import pandas as pdimport numpy as np 分別匯入了 Pandas 和 NumPy 模組。
  • 讀取 CSV 檔案pd.read_csv("data/movie.csv") 用於讀取名為 movie.csv 的 CSV 檔案。這個函式會將檔案中的資料讀取到一個 DataFrame 中。
  • 顯示資料movies 是讀取後的 DataFrame 物件,直接輸入 movies 會顯示該 DataFrame 的內容。

資料集描述

在這本文中,我們會使用到多個資料集來進行分析。每個資料集都有其特定的結構和含義。詳細的資料集描述可以在 GitHub 上找到:Pandas-Cookbook-Third-Edition

此圖示

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Pandas 基礎與應用:資料處理實戰

package "Pandas 資料處理" {
    package "資料結構" {
        component [Series
一維陣列] as series
        component [DataFrame
二維表格] as df
        component [Index
索引] as index
    }

    package "資料操作" {
        component [選取 Selection] as select
        component [篩選 Filtering] as filter
        component [分組 GroupBy] as group
        component [合併 Merge/Join] as merge
    }

    package "資料轉換" {
        component [重塑 Reshape] as reshape
        component [透視表 Pivot] as pivot
        component [聚合 Aggregation] as agg
    }
}

series --> df : 組成
index --> df : 索引
df --> select : loc/iloc
df --> filter : 布林索引
df --> group : 分組運算
group --> agg : 聚合函數
df --> merge : 合併資料
df --> reshape : melt/stack
reshape --> pivot : 重新組織

note right of df
  核心資料結構
  類似 Excel 表格
end note

@enduml

深入探索與應用

在每一個食譜中,我們都會提供詳細的步驟和解釋來幫助你理解如何使用 Pandas 處理資料。例如,如何進行資料清理、資料轉換、資料分析等。

更多實務應用

在這裡,我們不僅僅是介紹基礎操作,還會涉及到一些高階技巧和最佳實踐。例如:

  • 資料清理:處理缺失值、異常值等。
  • 資料轉換:將資料從一種形式轉換為另一種形式。
  • 資料分析:使用統計方法和視覺化工具來分析資料。

總之,Jupyter Notebook 和 Pandas 是一對強大的組合,能夠幫助我們高效地進行資料分析工作。希望這些能夠幫助你更好地掌握這些工具。

pandas 基礎

pandas 這個 Python 函式庫,主要用來處理結構化資料。那麼,什麼是結構化資料呢?結構化資料就是那些存放在表格中的資料,例如 CSV 檔案、Excel 試算表或資料函式庫表格。而非結構化資料則包括自由格式的文字、圖片、音訊或影片。如果你經常處理結構化資料,那麼 pandas 會是你非常實用的工具。

pandas 核心概念

在 pandas 中,有幾個核心的概念需要了解:

  1. pd.Series:這是一維的資料集合,可以將它想像成 Excel 中的單一欄位。所有 pd.Series 中的值必須有相同的型態。
  2. pd.DataFrame:這是二維的物件,可以將它想像成 Excel 的試算表或資料函式庫中的表格。pd.DataFrame 實際上是由多個 pd.Series 組成的集合。
  3. pd.Index:這沒有直接對應到其他工具中的功能。在 Excel 中,左側的行號可能是最接近的類別比,但那些行號通常只是用來顯示的。pd.Index 在 pandas 中可以用來選取值、合併表格等。

本章內容

本章將介紹如何手動構建 pd.Series 和 pd.DataFrame,如何自定義與這些物件相關聯的 pd.Index,以及展示在分析過程中你可能需要檢查的一些常見屬性。

pandas 基礎實作

引入 pandas

大多數使用 pandas 的人會使用別名 pd 來引入此函式庫,以便於呼叫。以下是基本的引入方式:

import pandas as pd
import numpy as np

此外,本文中許多範例也會使用 PyArrow 函式庫(2.x 系列中為可選依賴),並假設它已經被引入:

import pyarrow as pa

內容解密:

上述程式碼展示瞭如何引入 pandas 和 NumPy 函式庫並使用別名 pdnp。PyArrow 是一個高效能的資料處理函式庫,常與 pandas 一起使用來處理大型資料集。

Series

在 pandas 中,Series 是基本建構單位,它是一維的陣列與索引的組合。索引標籤可以用來查詢 Series 中的值。以下是幾種建立 Series 的方法。

建立 Series

  1. 使用列表: 最簡單的方式是提供一個序列,例如列表:

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

    內容解密:

    上述程式碼建立了一個包含三個整數值(0, 1, 2)的 Series。pandas 會自動推斷這些值的型態為 int64

  2. 使用元組: 元組也是一種序列,因此也可以作為 Series 的引數:

    pd.Series((12.34, 56.78, 91.01))
    

    內容解密:

    上述程式碼建立了一個包含三個浮點數值(12.34, 56.78, 91.01)的 Series。pandas 自動推斷這些值的型態為 float64

  3. 使用 range 函式: 生成範例資料時,常常會用到 Python 的 range 函式:

    pd.Series(range(0, 7, 2))
    

    內容解密:

    上述程式碼建立了一個包含從 0 開始、步長為 2 的整數序列(0, 2, 4, 6)的 Series。pandas 自動推斷這些值的型態為 int64

  4. 指定資料型態: 有時候你可能知道資料的確切型態和大小,可以顯式地告訴 pandas:

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

    內容解密:

    上述程式碼建立了一個包含三個整數值(0, 1, 2)且明確指定型態為 int8 的 Series。這樣可以節省記憶體並確保與其他系統(如 SQL 資料函式庫)的一致性。

  5. 命名 Series: 一個 Series 也可以附加名稱:

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

    內容解密:

    上述程式碼建立了一個包含三個水果名稱且命名為 “fruit” 的 Series。名稱可以用來更方便地識別和選取該 Series。

DataFrame

DataFrame 是 pandas 中最主要且最常用的物件。在大多數分析工作流程中,你會從其他來源匯入資料並將其轉換為 DataFrame。

建立 DataFrame

  1. 使用列表: 最基本的是用二維序列(如列表中的列表)來構建 DataFrame:

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

    內容解密:

    上述程式碼建立了一個包含三行三列整數值(0到8)的 DataFrame。pandas 自動生成行和列標籤。

  2. 自定義欄位名稱: 在從列表構建 DataFrame 時,可以提供自訂欄位名稱以提升可讀性:

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

    內容解密:

    上述程式碼建立了一個包含兩行兩欄整數值且自訂欄位名稱(col_a 和 col_b)的 DataFrame。

  3. 使用字典: 與列表不同的是,字典可以更直觀地指定欄位名稱和對應值:

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

    內容解密:

    上述程式碼建立了一個包含兩行兩欄文字值且自訂欄位名稱(first_name 和 last_name)的 DataFrame。

  4. 使用 Series: 不僅僅是列表和字典,Series 必須能夠作為 DataFrame 的輸入:

    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})
    

    內容解密:

    上述程式碼展示瞭如何從兩個已命名 Series 建立一個 DataFrame。每個 Series 分別命名為 int8_col 和 int16_col,並且型態分別為 int8 和 int16。

以上就介紹瞭如何在 pandas 中建立和操作基本物件——Series 和 DataFrame。接下來我們將進一步探討索引、屬性等更多高階特性。