Pandas 作為 Python 資料科學領域的核心函式庫,其提供的資料選取與指定功能是資料處理與分析的根本。理解如何有效運用這些功能對於提升程式碼效率至關重要。本文將深入剖析 Pandas 中的 Series
和 DataFrame
物件的屬性存取、資料選取與指定方法,包含 iloc
、loc
、布林遮罩以及多重索引選取等技巧,並探討資料選取的最佳實務與效能考量。從索引、欄位名稱到資料維度等屬性,我們將逐步解析如何取得資料結構的關鍵資訊。此外,針對不同資料選取情境,例如根據位置、標籤或條件篩選,本文將提供實用的程式碼範例和說明,幫助讀者掌握 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的維度資訊可以透過shape
、size
和len()
函式來取得:
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的列索引和欄位名稱可以分別透過index
和columns
屬性來存取:
print(df.index) # 列索引
print(df.columns) # 欄位名稱
資料維度資訊
DataFrame的維度資訊同樣可以透過shape
、size
和len()
函式來取得:
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
屬性,適合依照位置範圍進行資料選取;布林遮罩選取則是利用布林陣列來篩選符合條件的資料。
資料選取最佳實踐
在進行資料選取時,應根據實際需求選擇合適的選取方法:
- 使用
loc
進行標籤選取 - 使用
iloc
進行位置選取 - 使用布林陣列進行條件篩選
多重索引選取技術
對於具有多重索引的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同樣支援資料指定操作,可以透過loc
和iloc
來實作:
# 使用loc進行資料指定
df.loc["new_row"] = [30, 180, "green"]
# 使用iloc進行資料指定
df.iloc[0] = [25, 181, "red"]
Pandas 資料選擇與指定:深入解析
在 Pandas 中,資料選擇與指定是資料處理和分析的基礎操作。正確理解和使用這些操作對於高效地處理資料至關重要。本章節將深入探討 Pandas 中的資料選擇方法,包括使用 []
運算元、loc
和 iloc
方法進行資料選擇的技巧和注意事項。
使用 []
運算元進行資料選擇
在 Pandas 中,[]
運算元是一種常見的資料選擇方式。它可以用於 Series
和 DataFrame
物件中選擇資料。
對 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' 欄位
使用 loc
和 iloc
進行資料選擇
loc
和 iloc
是兩種更明確的資料選擇方法。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 的元素
資料選擇中的注意事項
- 索引型別:瞭解您正在使用的索引型別(整數、標籤或混合)對於正確選擇資料至關重要。
- 唯一性:當索引不唯一時,使用
[]
運算元可能會傳回多個值。 - 位置與標籤:明確區分位置選擇和標籤選擇,避免混淆。
實際應用範例
flowchart TD A[開始] --> B{選擇資料方法} B -->|使用 [] 運算元| C[根據索引或欄位名稱選擇] B -->|使用 loc| D[根據標籤選擇資料] B -->|使用 iloc| E[根據位置選擇資料] C --> F[處理 Series 或 DataFrame] D --> G[適合標籤索引] E --> H[適合位置索引]
圖表翻譯:
此圖表展示了在 Pandas 中選擇資料的不同方法。根據不同的需求,可以選擇使用 []
運算元、loc
或 iloc
進行資料選擇。每種方法都有其適用的場景和優點。
內容解密:
此範例程式碼展示瞭如何綜合運用 []
運算元、loc
和 iloc
進行資料選擇。透過這些方法,可以靈活高效地處理 Pandas 中的資料。程式碼中包含了對 Series
和 DataFrame
物件的操作範例,幫助讀者更好地理解和應用這些資料選擇技巧。
資料選擇與指定:深入解析pandas中的位置選擇與標籤選擇
在資料分析過程中,pandas函式庫提供了強大的資料選擇功能,主要分為位置選擇(position-based selection)和標籤選擇(label-based selection)。本章節將深入探討這兩種選擇方式在pd.Series
和pd.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.DataFrame
,iloc
需要兩個引數,分別用於選擇行和列:
# 建立一個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_legs
的Series
,並使用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[結束]
圖表翻譯:
此圖示比較了使用loc
和iloc
進行切片操作的差異。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 資料的靈活選取。