HOWTO · Pandas
在 Pandas 中獲取列與特定值匹配的行的索引
本文介紹瞭如何在 Pandas 中獲取列符合特定值的行的索引。
本頁內容
若要取得符合條件的資料列,請建立布林遮罩,並將它傳給 DataFrame.loc。若只需要這些資料列的標籤,則將相同遮罩套用至 DataFrame.index;需要一般 Python 清單時,可呼叫 tolist()。索引標籤用來識別資料列,不一定是連續的整數位置。重複使用同一個遮罩,可讓資料列選取結果與標籤保持一致,即使 DataFrame 使用自訂標籤也一樣。若還要處理符合條件的記錄,請使用 DataFrame.loc;若只需要標籤,則使用索引運算式。
在 Pandas 中依數值條件篩選資料列
此範例會選取欄 B 等於 19 的資料列,再將此條件與欄 C 的 OR 條件合併。DataFrame.loc 會傳回符合條件的資料列,而 DataFrame.index 會傳回其標籤。每個比較式都加上括號,可清楚表達合併後的布林條件。套用到實際的 DataFrame 時,請將範例中的欄名和值換成資料中的內容;使用 | 或 & 合併遮罩時,仍須將每個比較式括起來,讓 Python 對各個布林 Series 套用預期的運算。
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1, 20, size=(20, 4)), columns=list("ABCD"))
matches_b = df["B"] == 19
print(df.loc[matches_b])
print(df.index[matches_b].tolist())
matches_b_or_c = (df["B"] == 19) | (df["C"] == 19)
print(df.loc[matches_b_or_c])
print(df.index[matches_b_or_c].tolist())
A B C D
6 1 19 4 18
9 12 19 3 1
[6, 9]
A B C D
6 1 19 4 18
9 12 19 3 1
14 12 15 19 1
[6, 9, 14]
第一個遮罩會選出 B 值為 19 的資料列,其標籤是 [6, 9]。第二個遮罩使用 OR(|),因此 B 或 C 任一欄的值為 19 時,該資料列就會被選取;傳回的標籤是 [6, 9, 14]。若兩個條件都必須成立,請在加上括號的條件之間使用 &。這些是索引標籤,不是資料列位置;即使 DataFrame 曾經過篩選,或載入時使用了自訂索引,標籤仍可保有原本的意義。DataFrame.index 是屬性,不是方法;tolist() 會將選取到的標籤轉成 Python 清單,不必依賴特定的 pandas 索引類別。若原始標籤並非唯一,結果可能含有重複標籤,因為每個符合條件的資料列都會貢獻其索引標籤。
在 Pandas 中取得符合字串條件的資料列索引
字串篩選也使用相同的方式:將欄位與完整值比較以進行精確比對,或使用 str.contains 尋找子字串。當儲存格的完整值都必須相符時,適合使用精確比對;若值可能還包含其他文字,則可使用子字串比對。下方範例會取得符合條件的資料列及其標籤。子字串條件使用小寫的 rex,而 Tyrannosaurus rex 中也有大小寫相同的字串。
import pandas as pd
df = pd.DataFrame(
{
"Name": ["blue", "delta", "echo", "charlie", "alpha"],
"Type": ["Raptors", "Raptors", "Raptors", "Raptors", "Tyrannosaurus rex"],
}
)
exact_name = df["Name"] == "blue"
print(df.index[exact_name].tolist())
print(df.loc[exact_name])
name_contains_ha = df["Name"].str.contains("ha")
print(df.index[name_contains_ha].tolist())
print(df.loc[name_contains_ha])
name_contains_ha_and_type_contains_rex = name_contains_ha & df["Type"].str.contains("rex")
print(df.loc[name_contains_ha_and_type_contains_rex])
[0]
Name Type
0 blue Raptors
[3, 4]
Name Type
3 charlie Raptors
4 alpha Tyrannosaurus rex
Name Type
4 alpha Tyrannosaurus rex
精確比對會找到 blue,並傳回其標籤。子字串 ha 會匹配 charlie 和 alpha;再將它與 Type 欄的 rex 條件合併後,會選出 alpha 這一列,其標籤是 [4]。str.contains 預設會區分大小寫,因此請配合資料中的大小寫,或明確設定其 case 選項。若兩個條件都必須符合,請用 & 合併;若符合其中一個即可,則用 |,並將每個比較式括起來。與數值篩選相同,將遮罩傳給 DataFrame.loc 可取得資料列,傳給 DataFrame.index 則可取得標籤。若要改用其他欄位進行精確比對,可修改欄名和比較值;子字串比對則維持相同結構,只需換成另一個搜尋字串。