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 切片不包含结束位置。对于不连续的列,请提供位置列表或标签列表。