Pandas 的 DataFrame 和 Series 資料結構是資料科學的根本,提供直覺的表格型態資料表示和操作方式。理解這兩種資料結構的特性和使用方法,對於高效處理和分析資料至關重要。本文除了介紹資料結構的定義和建立方法,也涵蓋了資料篩選、排序、分組等常見操作,並探討了效能最佳化技巧,例如向量化操作和資料型別選擇,以協助讀者提升 Pandas 的使用效率。此外,文章也提及 Pandas 與其他函式庫的整合,展現其在資料科學生態系統中的重要性。

程式碼範例

# 建立Series
import pandas as pd
data = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(data)

# 建立DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['New York', 'London', 'Paris']}
df = pd.DataFrame(data)
print(df)

pandas 技術深度解析:結構化資料處理的利器

pandas 是 Python 生態系統中用於處理結構化資料的強大函式庫。它提供了高效、靈活的資料結構和資料分析工具,廣泛應用於資料科學、分析、程式設計和工程領域。本文將深入探討 pandas 的核心功能、技術原理和最佳實踐,幫助讀者全面掌握這一重要工具。

pandas 的核心資料結構

pandas 主要提供了兩種核心資料結構:Series 和 DataFrame。

Series:一維標籤陣列

Series 是 pandas 中的一維標籤陣列,可以儲存任意型別的資料(整數、浮點數、字串等)。它由兩個主要部分組成:索引(Index)和值(Values)。

import pandas as pd

# 建立一個簡單的 Series
data = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(data)

DataFrame:二維標籤資料結構

DataFrame 是 pandas 中的二維標籤資料結構,可以看作是由多個 Series 組成的字典,其中每個 Series 共用相同的索引。DataFrame 廣泛用於表示表格資料。

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

資料操作與轉換

pandas 提供了豐富的資料操作功能,包括篩選、排序、分組和合併等。

資料篩選

# 篩選年齡大於 30 的行
filtered_df = df[df['Age'] > 30]
print(filtered_df)

資料排序

# 按年齡升序排序
sorted_df = df.sort_values(by='Age')
print(sorted_df)

資料分組

# 按城市分組並計算平均年齡
grouped_df = df.groupby('City')['Age'].mean()
print(grouped_df)

資料輸入/輸出(I/O)

pandas 支援多種資料格式的讀取和寫入,包括 CSV、Excel、JSON 和 SQL 資料函式庫等。

讀取 CSV 檔案

# 讀取 CSV 檔案
df = pd.read_csv('data.csv')
print(df.head())

寫入 CSV 檔案

# 將 DataFrame 寫入 CSV 檔案
df.to_csv('output.csv', index=False)

效能最佳化

使用 pandas 時,效能最佳化至關重要。以下是一些常見的最佳化技巧:

  1. 使用向量化操作:盡量使用 pandas 提供的向量化操作,避免使用迴圈。
  2. 選擇合適的資料型別:使用合適的資料型別可以減少記憶體使用並提高運算效率。
  3. 避免不必要的資料複製:在進行資料操作時,盡量使用 inplace=True 引數避免不必要的資料複製。

Mermaid 圖表:pandas 資料處理流程

  flowchart TD
    A[資料輸入] --> B{資料清理}
    B -->|是| C[資料轉換]
    B -->|否| D[錯誤處理]
    C --> E[資料分析]
    D --> E
    E --> F[結果輸出]

圖表翻譯:

此圖示展示了使用 pandas 進行資料處理的典型流程。首先,資料被輸入到系統中。接著,進行資料清理。如果資料乾淨,則進入資料轉換階段;如果資料存在問題,則進行錯誤處理。無論是否經過錯誤處理,資料最終都會進入分析階段。最後,分析結果被輸出。這個流程清晰地展示了 pandas 在資料處理和分析中的關鍵步驟。

pandas 生態系統與擴充套件

pandas 不僅本身功能強大,還與其他多個開源函式庫緊密整合,形成了豐富的生態系統。例如:

  • NumPy:pandas 建立在 NumPy 之上,使用 NumPy 的陣列運算能力。
  • PyArrow:用於高效的資料序列化和反序列化。
  • Dask:提供平行計算能力,擴充套件 pandas 到大規模資料處理。
  • cuDF:根據 GPU 的 DataFrame 實作,加速資料處理。

pandas基礎入門:結構化資料處理利器

在資料科學領域,結構化資料的處理是一項基本且重要的任務。pandas函式庫正是為此而生,它提供了強大的資料結構和資料分析工具,幫助我們更高效地處理和分析結構化資料。

結構化資料與pandas

結構化資料是指儲存在表格中的資料,如CSV檔案、Excel試算表或資料函式庫表格等。相較之下,非結構化資料則包括自由格式的文字、影像、聲音或影片等。對於需要處理結構化資料的開發者和分析師來說,pandas是一個不可或缺的工具。

pandas的核心資料結構

pandas提供了兩種主要的資料結構:pd.Seriespd.DataFrame

pd.Series:單維度資料集合

pd.Series是一種單維度的資料集合,可以視為一個欄位或一列資料。它與Excel中的欄或資料函式庫中的欄位相似,但有個重要的區別:pd.Series中的所有值必須具有相同的資料型別。這種同質性使得pd.Series在進行資料操作和分析時更加高效。

import pandas as pd

# 建立一個簡單的pd.Series
data = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(data)

圖表1:pd.Series結構示意圖

  flowchart TD
 A[pd.Series] --> B[索引]
 A --> C[資料]
 B --> D[索引值:a, b, c, d, e]
 C --> E[資料值:1, 3, 5, 7, 9]

圖表翻譯:

此圖示展示了pd.Series的基本結構。它由索引和對應的資料值組成。索引提供了資料的標籤,而資料值則是實際儲存的內容。這種結構使得資料的存取和操作更加靈活高效。

pd.DataFrame:二維度資料結構

pd.DataFrame是一種二維度的資料結構,可以視為多個pd.Series物件的集合。它的結構類別似於Excel試算表或資料函式庫表格,可以包含不同資料型別的欄位。這種異質性使得pd.DataFrame能夠處理更複雜的資料結構。

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

圖表2:pd.DataFrame結構示意圖

  flowchart TD
 A[pd.DataFrame] --> B[欄位1:Name]
 A --> C[欄位2:Age]
 A --> D[欄位3:City]
 B --> E[資料列1:Alice]
 B --> F[資料列2:Bob]
 B --> G[資料列3:Charlie]
 C --> H[資料值:25, 30, 35]
 D --> I[資料值:New York, London, Tokyo]

圖表翻譯:

此圖示展示了pd.DataFrame的結構。它由多個欄位組成,每個欄位都是一個pd.Series物件。資料以資料列的形式組織,每一列代表一個觀測值或記錄。這種結構使得資料的組織和操作更加靈活。

索引物件:pd.Index

pd.Index是pandas中一個非常重要的概念,它用於標識和選取資料。雖然Excel中的自動編號行可以視為一種索引,但pd.Index的功能遠遠超出了簡單的顯示目的。它可以用於資料選取、表格合併等眾多操作。

# 建立一個pd.Index物件
index = pd.Index(['a', 'b', 'c'], name='my_index')
print(index)

本章重點

本章將介紹以下關鍵主題:

  1. 匯入pandas函式庫
  2. 建立和操作pd.Series物件
  3. 建立和操作pd.DataFrame物件
  4. 瞭解和使用pd.Index物件
  5. pd.Seriespd.DataFrame的屬性檢視

透過這些內容的學習,讀者將能夠熟練掌握pandas的基本操作,為進一步的資料分析工作打下堅實的基礎。

實際應用場景

pandas在資料分析中的應用非常廣泛,以下是一些常見的應用場景:

  1. 資料清理和預處理:處理缺失值、資料轉換、資料過濾等。
  2. 資料分析:進行資料統計、群組分析、資料透視等。
  3. 資料視覺化:結合Matplotlib等函式庫進行資料視覺化呈現。

效能最佳化策略

在使用pandas進行大規模資料處理時,以下是一些效能最佳化的策略:

  1. 使用向量化操作:盡量使用pandas內建的向量化操作,避免使用迴圈。
  2. 合理使用資料型別:選擇合適的資料型別可以減少記憶體使用並提高運算效率。
  3. 分塊處理大資料集:對於超大資料集,可以分塊讀取和處理,以避免記憶體不足的問題。

結語

pandas是Python資料分析生態系統中的核心元件之一。透過本章的學習,讀者應該能夠熟練使用pandas的基本資料結構和操作方法。這些知識將為進一步的資料分析工作奠定堅實的基礎。在實際應用中,結合其他資料科學工具,如NumPy、Matplotlib和Scikit-learn,可以發揮出pandas的最大價值。

pandas基礎建設

pandas的匯入

大多數pandas的使用者會使用別名來參照它,通常簡稱為pd。在本文中,我們將遵循這種慣例,但首先讓我們看看如何匯入pandas和NumPy:

import pandas as pd
import numpy as np

此外,許多範例也會使用到PyArrow函式庫,我們假設它被匯入為:

import pyarrow as pa

Series

pandas的基本建構區塊是pd.Series,它是一個一維的資料陣列,與pd.Index配對使用。索引標籤可以用來查詢pd.Series中的值,就像Python內建的字典使用鍵值對一樣。

如何建立Series

建立pd.Series最簡單的方法是提供一個值的序列,例如整數列表:

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

輸出:

0    0
1    1
2    2
dtype: int64

元組是另一種序列型別,因此它也是pd.Series建構函式的有效引數:

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

輸出:

0    12.34
1    56.78
2    91.01
dtype: float64

在生成範例資料時,您可能會經常使用Python的range函式:

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

輸出:

0    0
1    2
2    4
3    6
dtype: int64

在上述所有範例中,pandas會嘗試從其引數中推斷出適當的資料型別。然而,有些時候您可能比pandas更瞭解資料的型別和大小。透過dtype=引數明確提供此資訊給pandas,可以有助於節省記憶體或確保與其他型別系統(如SQL資料函式庫)正確整合。

自定義資料型別

讓我們使用一個簡單的range引數來填寫一個pd.Series,其中包含一系列整數。之前,推斷出的資料型別是64位元整數,但作為開發者,我們可能知道我們永遠不需要儲存更大的值,並且可以接受僅使用8位元的儲存空間(如果您不知道8位元和64位元整數之間的差異,這個主題將在第3章《資料型別》中介紹)。將dtype="int8"傳遞給pd.Series建構函式,可以讓pandas知道我們想要使用較小的資料型別:

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

輸出:

0    0
1    1
2    2
dtype: int8

Series的命名

pd.Series也可以有一個附加的名稱,可以透過name=引數指定(如果未指定,名稱預設為None):

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

輸出:

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

DataFrame

雖然pd.Series是基礎構件,但pd.DataFrame是大多數pandas使用者最常使用的物件。當人們提到pandas時,他們通常會想到使用pd.DataFrame

如何建立DataFrame

建立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

使用列表的列表時,pandas會自動為列和行建立預設的數字索引。通常,使用者至少會為列提供標籤,因為這使得索引和選擇pd.DataFrame中的資料更加直觀。要在建立pd.DataFrame時標記列,可以提供columns=引數給建構函式:

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.DataFrame並不嚴格要求列表。任何序列都可以使用,包括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

索引(Index)

在建立pd.Seriespd.DataFrame物件時,您可能已經注意到這些物件左側的值從0開始遞增。負責這些值的物件是pd.Index

如何自定義索引

在建立pd.Series時,改變行索引最簡單的方法是使用index=引數。在這個範例中,標籤dogcathuman將被用來代替預設的從0到2的pd.RangeIndex

pd.Series([4, 4, 2], index=["dog", "cat", "human"])

輸出:

dog      4
cat      4
human    2
dtype: int64

如果您想要更精細的控制,您可能需要在傳遞給index=引數之前自己建立pd.Index。在下面的範例中,pd.Index被命名為animal,而pd.Series本身被命名為num_legs,為資料提供了更多的上下文:

index = pd.Index(["dog", "cat", "human"], name="animal")
pd.Series([4, 4, 2], name="num_legs", index=index)

輸出:

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

pd.DataFrame對兩個維度都使用pd.Index。與pd.Series建構函式類別似,index=引數可以用來指定行標籤,而現在您還有columns=引數來控制列標籤:

pd.DataFrame([
    [24, 180],
    [42, 166],
], columns=["age", "height_cm"], index=["Jack", "Jill"])

輸出:

      age  height_cm
Jack   24        180
Jill   42        166

Series屬性

一旦您有了一個pd.Series,就有許多屬性可以檢查。最基本的屬性可以告訴您資料的型別和大小,這通常是您在從資料來源讀取資料時首先要檢查的內容。

圖表說明

  flowchart TD
 A[建立Series] --> B{檢查資料型別}
 B -->|是數值型| C[進行數值分析]
 B -->|是類別型| D[進行類別分析]
 C --> E[結果輸出]
 D --> E

圖表翻譯:

此圖表展示了根據Series資料型別進行不同分析流程的邏輯。如果資料是數值型,則進行數值分析;如果是類別型,則進行類別分析。最終,所有分析流程都會匯聚到結果輸出階段。這個流程幫助開發者根據不同的資料特性選擇適當的分析方法。

詳細內容

在pandas的基礎建設中,pd.Seriespd.DataFrame是兩個核心資料結構。pd.Series是一維的標籤化陣列,而pd.DataFrame則是二維的標籤化資料結構。瞭解如何建立和操作這兩個資料結構對於使用pandas至關重要。

程式碼範例

# 建立一個簡單的Series
s = pd.Series([1, 3, 5, 7, 9], name='奇數序列')
print(s)

# 建立一個DataFrame
data = {'姓名': ['張三', '李四', '王五'],
        '年齡': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)

截至目前的分析

本章節介紹了pandas的基礎建設,包括pd.Seriespd.DataFrame的建立和基本屬性。這些是使用pandas進行資料分析的基礎。接下來的章節將深入探討如何使用這些資料結構進行資料選擇和指定。

重要觀念

  1. 資料型別推斷:pandas能夠自動推斷資料的型別,但在某些情況下,上述範例展示瞭如何手動指定資料型別以節省記憶體或確保與其他系統的相容性。
  2. 自定義索引:透過index=引數,可以為pd.Seriespd.DataFrame自定義索引,使資料的標籤更具意義。
  3. 資料結構屬性:瞭解pd.Seriespd.DataFrame的屬性對於資料分析和操作至關重要。

隨著資料分析需求的增加,pandas的功能和最佳實踐將持續演進。未來可能會出現更多高效的資料處理方法,以及與其他資料科學工具的整合。開發者應持續關注pandas的更新和最佳實踐,以保持競爭力。