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 12000query方法的优势:
条件表达式更加接近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