HOWTO · Pandas

如何在 Pandas DataFrame 中選取多個欄位

了解如何使用方括號、`.iloc` 依位置索引,以及 `.loc` 依標籤索引,選取 Pandas DataFrame 的多個欄位,並比較各種語法,選擇適合目前工作的方式。

本頁內容

若要依欄位名稱從 Pandas DataFrame 選取多個欄位,請將欄位標籤組成清單,放在方括號內,例如 df[["Name", "Salary"]]。如果已知的是欄位位置,請使用 .iloc;若要依標籤選取列與欄,則可使用 .loc。

使用 __getitem__ 語法選取多個欄位

如果知道欄位名稱,直接使用方括號選取最簡單。外層方括號用來從 DataFrame 選取資料,內層清單則列出欄位標籤。本節介紹的就是 __getitem__ 選取方式。Pandas 會按照清單中的順序傳回欄位,不受這些欄位在原始 DataFrame 中排列順序的影響。

以下範例使用同一個小型 DataFrame,比較依名稱、欄位位置及標籤選取的結果。每個結果都包含所有列,並依指定順序排列選取的欄位。

import pandas as pd

df = pd.DataFrame({
    "Name": ["Alice", "Bob", "Charlie", "David"],
    "Age": [24, 30, 22, 35],
    "City": ["New York", "Los Angeles", "Chicago", "Houston"],
    "Salary": [70000, 80000, 65000, 90000],
})

by_name = df[["Name", "Salary"]]
by_position = df.iloc[:, [0, 3]]
by_label = df.loc[:, ["City", "Age"]]

print("By name:")
print(by_name.to_dict("records"))
print("\nBy position:")
print(by_position.to_dict("records"))
print("\nBy label:")
print(by_label.to_dict("records"))
By name:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]

By position:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]

By label:
[{'City': 'New York', 'Age': 24}, {'City': 'Los Angeles', 'Age': 30}, {'City': 'Chicago', 'Age': 22}, {'City': 'Houston', 'Age': 35}]

DataFrame 的方括號存取會呼叫 __getitem__ 操作;一般情況下,直接使用易讀的方括號語法即可,不必直接呼叫這個特殊方法。

使用 .iloc 依位置選取欄位

.iloc 是 Pandas 依整數位置索引的索引器。在 df.iloc[:, [0, 3]] 中,逗號前的冒號代表選取所有列,[0, 3] 則代表選取第一欄和第四欄。位置從零開始,因此若 DataFrame 的欄位順序改變,這些數字所選到的資料也可能跟著改變。當欄位位置具有意義,或沒有可用的欄位標籤時,適合使用 .iloc。

使用 .loc 依標籤選取欄位

.loc 是依標籤選取資料的索引器。在 df.loc[:, ["City", "Age"]] 中,列選取器是 :,欄選取器則是標籤清單。傳回結果會依指定順序排列,也就是先 City、再 Age。你也可以像行內範例 df.loc[df["Age"] > 25, ["Name", "City"]] 一樣,同時使用列條件和欄位清單,只保留符合條件的列並傳回指定欄位。若選取工作依據標籤,或需要同時選取列與欄,請使用 .loc。

結論

要選取多個具名欄位,可使用 df[["a", "b"]];要依整數位置選取,使用 .iloc;要依標籤選取並視需要指定列,則使用 .loc。欄位名稱能表達所需資料時,選擇標籤;若欄位所在順序才是關鍵資訊,則選擇位置。

常見問題

如何依名稱選取欄位? 將標籤清單放在 DataFrame 的方括號內,例如 df[["column1", "column2"]]。

.iloc 和 .loc 有什麼差異? .iloc 依從零開始的整數位置選取;.loc 則依標籤選取。兩者都接受以逗號分隔的列選取器和欄選取器。

可以同時選取列和欄嗎? 可以。使用 .loc 時,在逗號前放入列標籤或條件,逗號後放入所需欄位標籤,例如 df.loc[df["Age"] > 25, ["Name", "City"]]。

應該使用哪種語法? 已知欄位名稱時,使用方括號搭配清單;已知欄位的整數位置時,使用 .iloc;若要依標籤選取,並可能同時篩選列,則使用 .loc。

如果需要選取很多欄位呢? 將所需欄位名稱放入清單即可。如果欄位位於連續範圍,也可以讓 .iloc 使用切片;請記得 .iloc 切片不包含結尾位置。若要選取不連續的欄位,請提供位置或標籤清單。