Pandas DataFrame按条件筛选数据的6种方法

0 次阅读

Pandas作为Python数据分析领域中最常用的数据处理库之一,提供了丰富的数据筛选能力。DataFrame按条件筛选数据是日常数据分析、数据清洗以及机器学习预处理中的高频操作。掌握灵活的数据过滤方法,可以快速定位目标数据,提高数据处理效率。

本文将详细介绍Pandas DataFrame按条件筛选数据的6种常用方法,包括布尔索引、query方法、isin方法、多条件组合、字符串筛选以及函数筛选等实际应用场景。

1. 使用布尔索引进行条件筛选

布尔索引是Pandas中最基础也是最常用的数据筛选方式。它通过构造一个由True和False组成的条件数组,对DataFrame中的数据进行过滤。

例如,有如下员工数据:

import pandas as pd

df = pd.DataFrame({
    "name": ["张三", "李四", "王五", "赵六"],
    "age": [25, 32, 28, 40],
    "salary": [6000, 9000, 7500, 12000]
})

筛选年龄大于30岁的员工:

result = df[df["age"] > 30]

print(result)

执行结果:

  name  age  salary
1  李四   32    9000
3  赵六   40   12000

这种方式代码简单直观,适合处理单一条件的数据过滤。

常见比较条件包括:

df[df["age"] >= 30]    # 大于等于
df[df["age"] < 30]     # 小于
df[df["name"] == "张三"] # 等于
df[df["salary"] != 6000] # 不等于

在实际项目中,布尔索引几乎是使用频率最高的DataFrame筛选方式。

2. 使用query方法筛选数据

Pandas提供了query()方法,可以使用类似SQL条件语句的形式筛选数据,使代码更加简洁易读。

例如:

result = df.query("age > 30")

等价于:

result = df[df["age"] > 30]

如果需要多个条件组合:

result = df.query("age > 25 and salary > 7000")

查询结果:

  name  age  salary
1  李四   32    9000
2  王五   28    7500
3  赵六   40   12000

query方法的优势:

  • 条件表达式更加接近SQL语法;

  • 多条件查询更加清晰;

  • 适合复杂筛选逻辑。

需要注意的是,如果列名包含空格或特殊字符,需要使用反引号:

df.query("`user age` > 20")

3. 使用isin()实现多值条件筛选

当需要根据多个指定值进行筛选时,isin()方法非常方便。

例如,只查询指定员工:

result = df[df["name"].isin(["张三", "王五"])]

结果:

  name  age  salary
0  张三   25    6000
2  王五   28    7500

相比多个or条件:

df[(df["name"] == "张三") | (df["name"] == "王五")]

使用isin()更加简洁。

isin()不仅可以用于字符串,也可以用于数字:

df[df["age"].isin([25, 28, 40])]

在处理数据库查询结果、分类数据过滤时,isin()具有很高的实用价值。

4. 使用多个条件组合筛选数据

实际业务中,经常需要同时满足多个条件。例如筛选年龄超过25岁,并且工资高于7000的数据。

Pandas中可以通过逻辑运算符组合条件:

AND条件

使用&表示并且:

result = df[(df["age"] > 25) & (df["salary"] > 7000)]

OR条件

使用|表示或者:

result = df[(df["age"] > 35) | (df["salary"] > 10000)]

NOT条件

使用~表示取反:

result = df[~(df["age"] < 30)]

需要注意:

多个条件组合时,每个条件必须使用括号包裹,否则容易出现运算优先级错误。

错误写法:

df[df["age"] > 25 & df["salary"] > 7000]

正确写法:

df[(df["age"] > 25) & (df["salary"] > 7000)]

5. 使用字符串方法筛选文本数据

对于包含文本的数据列,Pandas提供了str访问器,可以实现灵活的字符串条件筛选。

例如,筛选姓名中包含“三”的数据:

result = df[df["name"].str.contains("三")]

常见字符串筛选方法:

判断是否以指定字符开头

df[df["name"].str.startswith("张")]

判断是否以指定字符结尾

df[df["name"].str.endswith("五")]

忽略大小写匹配

df[df["name"].str.contains("zhang", case=False)]

正则表达式筛选

df[df["name"].str.contains("^张")]

字符串筛选常用于日志分析、用户信息处理、商品名称过滤等场景。

6. 使用apply()和自定义函数筛选数据

当筛选条件比较复杂,无法简单通过比较运算完成时,可以使用apply()结合自定义函数。

例如,筛选工资和年龄满足特殊规则的数据:

def check(row):
    return row["age"] > 30 and row["salary"] > 8000

result = df[df.apply(check, axis=1)]

执行后会返回符合自定义逻辑的数据。

apply()适合以下场景:

  • 多字段联合判断;

  • 复杂业务规则;

  • 需要调用外部函数处理的数据。

不过需要注意,apply()通常比向量化操作慢。如果数据量较大,应优先考虑布尔索引、query等方式。

Pandas条件筛选中的常见技巧

1. 筛选后获取指定列

不仅可以筛选行,还可以同时选择列:

result = df.loc[df["age"] > 30, ["name", "salary"]]

结果:

  name  salary
1  李四    9000