基于列值从DataFrame中选择行的方法

基于列值从DataFrame中选择行的方法

技术背景

在数据处理和分析中,经常需要根据DataFrame中某列的值来筛选出符合条件的行。Pandas是Python中用于数据处理和分析的强大库,它提供了多种方法来实现基于列值选择行的操作。

实现步骤

1. 基本筛选条件

列值等于标量

使用==运算符来选择列值等于某个标量的行。

1
2
3
4
5
6
7
import pandas as pd

df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': range(8), 'D': range(8) * 2})

result = df.loc[df['A'] == 'foo']

列值在可迭代对象中

使用isin方法选择列值在某个可迭代对象中的行。

1
result = df.loc[df['B'].isin(['one', 'three'])]

组合多个条件

使用&(逻辑与)和|(逻辑或)组合多个条件。注意使用括号来明确运算顺序。

1
result = df.loc[(df['C'] >= 2) & (df['C'] <= 5)]

2. 排除特定值

列值不等于标量

使用!=运算符来选择列值不等于某个标量的行。

1
result = df.loc[df['A'] != 'foo']

列值不在可迭代对象中

使用~(逻辑非)来否定isin方法的结果。

1
result = df.loc[~df['B'].isin(['one', 'three'])]

3. 其他选择方法

使用query方法

query方法提供了一种简洁的方式来筛选数据,尤其适用于复杂的条件。

1
result = df.query('A == "foo" and B in ["one", "three"]')

使用groupby方法

可以使用groupby方法根据某列的值进行分组,然后选择特定的组。

1
2
grouped = df.groupby('B')
result = grouped.get_group('two')

核心代码

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
import pandas as pd
import numpy as np

# 创建DataFrame
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})

# 列值等于标量
result1 = df.loc[df['A'] == 'foo']

# 列值在可迭代对象中
result2 = df.loc[df['B'].isin(['one', 'three'])]

# 组合多个条件
result3 = df.loc[(df['C'] >= 2) & (df['C'] <= 5)]

# 列值不等于标量
result4 = df.loc[df['A'] != 'foo']

# 列值不在可迭代对象中
result5 = df.loc[~df['B'].isin(['one', 'three'])]

# 使用query方法
result6 = df.query('A == "foo" and B in ["one", "three"]')

# 使用groupby方法
grouped = df.groupby('B')
result7 = grouped.get_group('two')

最佳实践

性能优化

  • 使用NumPy数组:在创建布尔掩码时,使用values属性获取底层的NumPy数组可以提高性能。
1
2
mask = df['A'].values == 'foo'
result = df[mask]
  • 安装numexpr:安装numexpr库可以加速query方法的执行,尤其对于大型DataFrame。
1
2
3
4
5
6
7
8
9
10
# 安装numexpr
# pip install numexpr

import pandas as pd

df = pd.DataFrame({'A': 'foo bar foo baz foo bar foo foo'.split() * 10000,
'B': np.random.rand(80000)})

# 使用query方法
result = df.query('A == "foo"')

灵活性提升

  • 使用f-strings:在query方法中使用f-strings可以动态地指定列名和查询条件。
1
2
3
col = 'A'
my_var = 'foo'
result = df.query(f"{col} == '{my_var}'")

常见问题

运算符优先级问题

在组合多个条件时,由于Python的运算符优先级规则,&|的优先级可能会导致意外的结果。因此,务必使用括号来明确运算顺序。

性能问题

对于大型DataFrame,某些筛选方法可能会变得很慢。可以考虑使用上述的性能优化方法,如使用NumPy数组和安装numexpr库。

列名包含空格问题

如果列名包含空格,可以使用反引号(`)来引用列名。

1
2
df = pd.DataFrame({'Sender email': ['[email protected]', "[email protected]", "[email protected]"]})
result = df.query('`Sender email`.str.endswith("@shop.com")')

基于列值从DataFrame中选择行的方法
https://119291.xyz/posts/2025-05-09.selecting-rows-from-dataframe-based-on-column-values/
作者
ww
发布于
2025年5月9日
许可协议