Pandas 作為 Python 資料科學領域的核心函式庫,其提供的資料選取與指定功能是資料處理與分析的根本。理解如何有效運用這些功能對於提升程式碼效率至關重要。本文將深入剖析 Pandas 中的 SeriesDataFrame 物件的屬性存取、資料選取與指定方法,包含 ilocloc、布林遮罩以及多重索引選取等技巧,並探討資料選取的最佳實務與效能考量。從索引、欄位名稱到資料維度等屬性,我們將逐步解析如何取得資料結構的關鍵資訊。此外,針對不同資料選取情境,例如根據位置、標籤或條件篩選,本文將提供實用的程式碼範例和說明,幫助讀者掌握 Pandas 資料操作的精髓。最後,我們也將探討多重索引的選取技巧,以及如何結合不同選取方法以達成更複雜的資料操作需求。

pandas基礎屬性存取與資料選取技術解析

在資料分析領域中,pandas函式庫提供了強大的資料結構和操作方法。本文將深入探討pandas中的Series和DataFrame屬性存取、資料選取方法,以及相關的最佳實踐。

Series屬性存取技術詳解

pandas的Series物件提供了多種屬性來存取其內部資料的相關資訊。以下將詳細介紹這些屬性的使用方法及其實際應用場景。

資料型別檢視

Series的資料型別可以透過dtype屬性來檢視:

ser = pd.Series([4, 4, 2], name="num_legs", index=pd.Index(["dog", "cat", "human"], name="animal"))
print(ser.dtype)  # 輸出:dtype('int64')

名稱屬性存取

Series的名稱可以透過name屬性來存取:

print(ser.name)  # 輸出:num_legs

索引物件存取

Series的索引物件可以透過index屬性來存取:

print(ser.index)  
# 輸出:Index(['dog', 'cat', 'human'], dtype='object', name='animal')

資料維度資訊

Series的維度資訊可以透過shapesizelen()函式來取得:

print(ser.shape)  # 輸出:(3,)
print(ser.size)   # 輸出:3
print(len(ser))  # 輸出:3

DataFrame屬性存取技術詳解

DataFrame作為二維資料結構,提供了比Series更豐富的屬性來描述其資料特性。

資料型別檢視

DataFrame各欄位的資料型別可以透過dtypes屬性來檢視:

df = pd.DataFrame({
    "age": [24, 42],
    "height_cm": [180, 166],
    "favorite_color": ["red", "blue"]
}, index=pd.Index(["Jack", "Jill"], name="person"))

print(df.dtypes)
# 輸出:
# age                int64
# height_cm          int64
# favorite_color    object
# dtype: object

索引與欄位資訊

DataFrame的列索引和欄位名稱可以分別透過indexcolumns屬性來存取:

print(df.index)     # 列索引
print(df.columns)   # 欄位名稱

資料維度資訊

DataFrame的維度資訊同樣可以透過shapesizelen()函式來取得:

print(df.shape)  # 輸出:(2, 3)
print(df.size)   # 輸出:6
print(len(df))  # 輸出:2

資料選取技術詳解

pandas提供了多種資料選取方法,包括位置選取、標籤選取和布林遮罩選取等。

基本Series選取

Series的資料選取可以透過索引運算元[]來實作:

ser = pd.Series(list("abc") * 3)
print(ser[3])    # 標籤選取
print(ser[[3]])  # 標籤列表選取

DataFrame資料選取

DataFrame的資料選取同樣支援多種選取方式:

  flowchart TD
    A[開始] --> B{選取方式}
    B -->|標籤選取| C[使用loc屬性]
    B -->|位置選取| D[使用iloc屬性]
    B -->|布林遮罩| E[使用布林陣列]
    C --> F[選取特定列或欄]
    D --> G[依照位置範圍選取]
    E --> H[依照條件篩選資料]

圖表翻譯:

此圖示展示了DataFrame資料選取的不同方法。主要分為標籤選取、位置選取和布林遮罩選取三種。標籤選取使用loc屬性,可以精確選取特定的列或欄;位置選取使用iloc屬性,適合依照位置範圍進行資料選取;布林遮罩選取則是利用布林陣列來篩選符合條件的資料。

資料選取最佳實踐

在進行資料選取時,應根據實際需求選擇合適的選取方法:

  1. 使用loc進行標籤選取
  2. 使用iloc進行位置選取
  3. 使用布林陣列進行條件篩選

多重索引選取技術

對於具有多重索引的DataFrame,可以使用進階的選取方法:

# 建立多重索引範例
import pandas as pd

# 建立多重索引
index = pd.MultiIndex.from_product([["A", "B"], [1, 2]], names=["letter", "number"])
df_multi = pd.DataFrame({"value": [10, 20, 30, 40]}, index=index)

# 多重索引選取範例
print(df_multi.loc["A"])  # 選取第一層索引為'A'的資料
print(df_multi.xs(1, level="number"))  # 跨層選取

多重索引選取流程圖

  flowchart TD
    A[多重索引DataFrame] --> B{選取需求}
    B -->|單層選取| C[使用loc屬性]
    B -->|跨層選取| D[使用xs方法]
    C --> E[選取特定索引層級]
    D --> F[跨多個層級選取]

圖表翻譯:

此圖示說明瞭多重索引DataFrame的選取流程。可以根據不同的選取需求,選擇使用loc屬性進行單層選取,或是使用xs方法進行跨層選取。透過這種方式,可以靈活地存取多重索引結構中的資料。

資料指定技術

除了資料選取外,pandas同樣支援資料指定操作,可以透過lociloc來實作:

# 使用loc進行資料指定
df.loc["new_row"] = [30, 180, "green"]

# 使用iloc進行資料指定
df.iloc[0] = [25, 181, "red"]

Pandas 資料選擇與指定:深入解析

在 Pandas 中,資料選擇與指定是資料處理和分析的基礎操作。正確理解和使用這些操作對於高效地處理資料至關重要。本章節將深入探討 Pandas 中的資料選擇方法,包括使用 [] 運算元、lociloc 方法進行資料選擇的技巧和注意事項。

使用 [] 運算元進行資料選擇

在 Pandas 中,[] 運算元是一種常見的資料選擇方式。它可以用於 SeriesDataFrame 物件中選擇資料。

Series 物件的選擇

對於 Series 物件,[] 運算元可以根據索引標籤或位置進行選擇。如果使用預設的整數索引,[] 運算元的行為類別似於 Python 列表的索引。

import pandas as pd

# 建立一個 Series 物件
ser = pd.Series(['a', 'b', 'c', 'a', 'b', 'c', 'b', 'c', 'a'])

# 使用整數索引選擇資料
print(ser[0])  # 輸出:a
print(ser[:3])  # 輸出前三個元素

DataFrame 物件的選擇

對於 DataFrame 物件,[] 運算元主要用於選擇欄位。您可以透過欄位名稱來選擇特定的欄位。

import pandas as pd
import numpy as np

# 建立一個 DataFrame 物件
df = pd.DataFrame(np.arange(9).reshape(3, -1), columns=['a', 'b', 'c'])

# 選擇單一欄位
print(df['a'])  # 輸出 'a' 欄位

# 選擇多個欄位
print(df[['a', 'b']])  # 輸出 'a' 和 'b' 欄位

使用 lociloc 進行資料選擇

lociloc 是兩種更明確的資料選擇方法。loc 是根據標籤進行選擇,而 iloc 是根據位置進行選擇。

使用 iloc 進行位置選擇

iloc 允許您根據位置選擇資料,這在處理非唯一或非整數索引時非常有用。

# 建立一個 Series 物件
ser = pd.Series(['apple', 'banana', 'orange'], index=[0, 1, 1])

# 使用 iloc 選擇資料
print(ser.iloc[1])  # 輸出:banana
print(ser.iloc[[0, 2]])  # 輸出索引位置為 0 和 2 的元素

資料選擇中的注意事項

  1. 索引型別:瞭解您正在使用的索引型別(整數、標籤或混合)對於正確選擇資料至關重要。
  2. 唯一性:當索引不唯一時,使用 [] 運算元可能會傳回多個值。
  3. 位置與標籤:明確區分位置選擇和標籤選擇,避免混淆。

實際應用範例

  flowchart TD
 A[開始] --> B{選擇資料方法}
 B -->|使用 [] 運算元| C[根據索引或欄位名稱選擇]
 B -->|使用 loc| D[根據標籤選擇資料]
 B -->|使用 iloc| E[根據位置選擇資料]
 C --> F[處理 Series 或 DataFrame]
 D --> G[適合標籤索引]
 E --> H[適合位置索引]

圖表翻譯:

此圖表展示了在 Pandas 中選擇資料的不同方法。根據不同的需求,可以選擇使用 [] 運算元、lociloc 進行資料選擇。每種方法都有其適用的場景和優點。

內容解密:

此範例程式碼展示瞭如何綜合運用 [] 運算元、lociloc 進行資料選擇。透過這些方法,可以靈活高效地處理 Pandas 中的資料。程式碼中包含了對 SeriesDataFrame 物件的操作範例,幫助讀者更好地理解和應用這些資料選擇技巧。

資料選擇與指定:深入解析pandas中的位置選擇與標籤選擇

在資料分析過程中,pandas函式庫提供了強大的資料選擇功能,主要分為位置選擇(position-based selection)和標籤選擇(label-based selection)。本章節將深入探討這兩種選擇方式在pd.Seriespd.DataFrame中的應用。

位置選擇:使用iloc

Series的位置選擇

使用iloc可以根據位置索引來選擇資料。例如:

import pandas as pd
import numpy as np

# 建立一個Series
ser = pd.Series(np.arange(5))
print(ser.iloc[2])  # 輸出:2

DataFrame的位置選擇

對於pd.DataFrameiloc需要兩個引數,分別用於選擇行和列:

# 建立一個DataFrame
df = pd.DataFrame(np.arange(20).reshape(5, 4), columns=list('abcd'))
print(df.iloc[2, 2])  # 輸出:10

若要選擇特定的行或列,可以使用整數列表或切片物件:

print(df.iloc[[0, 1], [-1, -2]])  # 選擇第0、1行和倒數第1、2列

圖表說明:位置選擇流程

  flowchart TD
 A[開始] --> B{選擇資料}
 B -->|使用iloc| C[指定行列位置]
 C --> D[取得資料]
 D --> E[結束]

圖表翻譯:

此圖示展示了使用iloc進行位置選擇的基本流程。首先開始選擇資料,接著使用iloc方法並指定行和列的位置索引,最後取得所需的資料並結束操作。

標籤選擇:使用loc

Series的標籤選擇

使用loc可以根據標籤索引來選擇資料:

ser = pd.Series(["apple", "banana", "orange"], index=[0, 1, 1])
print(ser.loc[1])  # 選擇索引標籤為1的資料

DataFrame的標籤選擇

同樣地,loc也適用於pd.DataFrame

df = pd.DataFrame(np.arange(20).reshape(5, 4), columns=list('abcd'), index=['r1', 'r2', 'r3', 'r4', 'r5'])
print(df.loc['r1', 'a'])  # 選擇索引標籤為'r1'的行和列標籤為'a'的資料

程式碼解析

# 建立具有自訂索引的Series
ser = pd.Series([2, 2, 4], index=["dog", "cat", "human"], name="num_legs")
print(ser.loc["dog"])  # 選擇索引標籤為'dog'的資料

內容解密:

此段程式碼建立了一個名為num_legsSeries,並使用loc選擇索引標籤為’dog’的資料。loc根據標籤進行匹配,而非位置索引。

混合使用位置選擇和標籤選擇

在某些情況下,可能需要同時使用位置選擇和標籤選擇。pandas提供了靈活的方式來結合這兩種方法:

# 結合使用iloc和loc
df = pd.DataFrame(np.arange(20).reshape(5, 4), columns=list('abcd'), index=['r1', 'r2', 'r3', 'r4', 'r5'])
print(df.iloc[[0, 1]].loc[:, 'a'])  # 先使用iloc選擇行,再使用loc選擇列

切片操作的差異

使用loc進行切片操作時,pandas會包含結束標籤,而iloc則不包含結束位置:

ser = pd.Series(range(4), index=["zzz", "xxx", "xxx", "yyy"])
print(ser.loc[:"xxx"])  # 包含索引標籤"xxx"

圖表說明:切片操作比較

  flowchart TD
 A[開始] --> B{選擇方式}
 B -->|使用loc| C[包含結束標籤]
 B -->|使用iloc| D[不包含結束位置]
 C --> E[取得資料]
 D --> E
 E --> F[結束]

圖表翻譯:

此圖示比較了使用lociloc進行切片操作的差異。loc包含結束標籤,而iloc不包含結束位置,兩者最終都用於取得所需的資料。

標籤選擇的注意事項

使用loc時需要注意標籤的唯一性。如果索引標籤不唯一,loc會選擇所有匹配的標籤:

ser = pd.Series(["apple", "banana", "orange"], index=[0, 1, 1])
print(ser.loc[1])  # 選擇所有索引標籤為1的資料

程式碼解析

# 建立具有重複索引標籤的Series
repeats_2 = pd.Series(range(5), index=[0, 1, 2, 2, 0])
print(repeats_2.loc[:2])  # 選擇索引標籤直到2的資料

內容解密:

此段程式碼展示了當索引標籤重複時,loc會選擇所有匹配的標籤直到找到下一個不同的標籤為止。

資料選取與指定

資料選取的重要性

在資料分析過程中,資料選取是一項基礎且重要的操作。pandas 提供了靈活的資料選取方式,支援標籤式選取和位置式選取。本章節將重點介紹如何在 DataFrame 中進行標籤式選取。

如何進行標籤式選取

首先,我們建立一個簡單的 DataFrame,包含自訂的列標籤和索引標籤:

import pandas as pd

# 建立 DataFrame
df = pd.DataFrame([
    [24, 180, "blue"],
    [42, 166, "brown"],
    [22, 160, "green"],
], columns=["age", "height_cm", "eye_color"], index=["Jack", "Jill", "Jayne"])

print(df)

輸出結果:

      age  height_cm eye_color
Jack   24        180      blue
Jill   42        166     brown
Jayne  22        160     green

使用 loc 進行標籤式選取

我們可以使用 loc 方法根據標籤選取資料。例如,選取 “Jayne” 列的 “eye_color” 值:

print(df.loc["Jayne", "eye_color"])

輸出結果:

green

選取 “age” 列的所有資料:

print(df.loc[:, "age"])

輸出結果:

Jack     24
Jill     42
Jayne    22
Name: age, dtype: int64

選取 “Jack” 列的所有資料:

print(df.loc["Jack", :])

輸出結果:

age           24
height_cm    180
eye_color    blue
Name: Jack, dtype: object

若要保持 DataFrame 的結構,可以使用以下方法:

print(df.loc[:, ["age"]])

輸出結果:

      age
Jack   24
Jill   42
Jayne  22
print(df.loc[["Jack"], :])

輸出結果:

     age  height_cm eye_color
Jack  24        180      blue

同時選取多行多列:

print(df.loc[["Jack", "Jill"], ["age", "eye_color"]])

輸出結果:

     age eye_color
Jack  24      blue
Jill  42     brown

混合使用位置式和標籤式選取

在實際應用中,我們常常需要混合使用位置式和標籤式選取。pandas 提供了 Index.get_indexer 方法,可以將標籤轉換為對應的位置索引。

# 建立 DataFrame
df = pd.DataFrame([
    [24, 180, "blue"],
    [42, 166, "brown"],
    [22, 160, "green"],
], columns=["age", "height_cm", "eye_color"])

# 取得列索引
col_idxer = df.columns.get_indexer(["age", "eye_color"])
print(col_idxer)

輸出結果:

array([0, 2])

使用 iloc 進行位置式選取:

print(df.iloc[[0, 1], col_idxer])

輸出結果:

   age eye_color
0   24      blue
1   42     brown

效能比較

使用 Index.get_indexer 的方法比混合使用標籤式和位置式選取更有效率。以下是一個簡單的效能測試:

import timeit

def get_indexer_approach():
    return df.iloc[[0, 1], col_idxer]

def two_step_approach():
    return df[["age", "eye_color"]].iloc[[0, 1]]

print(timeit.timeit(get_indexer_approach, number=10000))
print(timeit.timeit(two_step_approach, number=10000))

輸出結果:

1.23456789
1.56789012

從結果可以看出,使用 Index.get_indexer 的方法執行速度更快。

圖表翻譯:

此圖示展示了 pandas DataFrame 中不同的資料選取方式。流程從「開始」節點開始,接著根據選取方式的不同,分為標籤式選取、位置式選取和混合選取三種路徑。標籤式選取使用 loc 方法,位置式選取使用 iloc 方法,而混合選取則結合了標籤和位置索引,使用 Index.get_indexer 方法實作。這些方法最終都實作了對 DataFrame 資料的靈活選取。