Selecting multiple columns in a Pandas dataframe

Selecting multiple columns in a Pandas dataframe

技术背景

在数据处理和分析中,经常需要从 Pandas 的 DataFrame 中选择多个列进行操作。Pandas 提供了多种方法来实现这一需求,每种方法都有其适用场景。

实现步骤

1. 通过列名列表选择

可以将列名作为列表传递给 __getitem__ 语法(即 [])来选择特定的列。

1
df1 = df[['a', 'b']]

2. 通过列索引选择

使用 iloc 方法,根据列的位置索引来选择列。

1
df1 = df.iloc[:, 0:2]

3. 使用 .loc 方法

从版本 0.11.0 开始,可以使用 .loc 索引器按列名进行切片选择。

1
df.loc[:, 'C':'E']

4. 使用布尔数组选择

.loc 方法也接受布尔数组,可用于选择布尔数组中对应值为 True 的列。

1
df.loc[:, df.columns.isin(list('BCD'))]

5. 使用 filter 方法

filter 方法可用于筛选或重新排序列。

1
df1 = df.filter(['a', 'b'])

6. 使用 drop 方法

通过指定要删除的列列表,返回仅包含所需列的 DataFrame。

1
2
colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

7. 使用 reindex 方法

从版本 0.21.0 开始,推荐使用 reindex 方法来选择列,避免使用 .loc[] 时出现的弃用警告。

1
df1 = df.reindex(columns=['b', 'c'])

核心代码

以下是一个完整的示例,展示了如何使用不同方法选择列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import numpy as np

# 创建 DataFrame
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 6)),
columns=list('ABCDEF'),
index=['R{}'.format(i) for i in range(100)])

# 通过列名列表选择
df1 = df[['A', 'B']]

# 通过列索引选择
df2 = df.iloc[:, 0:2]

# 使用 .loc 方法
df3 = df.loc[:, 'C':'E']

# 使用布尔数组选择
df4 = df.loc[:, df.columns.isin(list('BCD'))]

# 使用 filter 方法
df5 = df.filter(['A', 'B'])

# 使用 drop 方法
colsToDrop = ['A']
df6 = df.drop(colsToDrop, axis=1)

# 使用 reindex 方法
df7 = df.reindex(columns=['B', 'C'])

最佳实践

  • 在实际应用中,最常用的方法是 [cols]__getitem__(cols) 方法,例如 df[['A', 'B']]
  • 如果担心 SettingWithCopyWarning 警告,可以在导入 Pandas 后立即开启写时复制模式。
1
2
3
4
pd.set_option('mode.copy_on_write', True)
df = pd.DataFrame(0, range(5), [*'ABCD'])
df1 = df[['A', 'C']]
df1['E'] = 1

常见问题

1. SettingWithCopyWarning 警告

在某些情况下,对切片对象的修改可能会影响原始对象。可以使用 .copy() 方法创建一个副本,或者开启写时复制模式来避免此问题。

2. 'index' 作为列名的问题

'index' 是一个不建议用于 DataFrame 列名的名称,因为它与 df.index 属性冲突。

3. 弃用警告

从版本 0.21.0 开始,使用 .loc[] 并传入包含一个或多个缺失标签的列表会产生弃用警告,推荐使用 reindex 方法。


Selecting multiple columns in a Pandas dataframe
https://119291.xyz/posts/selecting-multiple-columns-in-a-pandas-dataframe/
作者
ww
发布于
2025年5月26日
许可协议