12.2 多条件筛选(重点,实战高频)
Pandas多条件筛选:逻辑运算符与query方法实战指南
本章节详细讲解Pandas中多条件筛选的核心方法,包括逻辑与(&)、逻辑或(|)、逻辑非(~)的使用,注意事项如括号优先级和表达式规范,并推荐简化筛选的query方法,适合数据分析初学者快速掌握。
推荐工具
Pandas多条件筛选
多条件筛选是Pandas数据处理的重点内容,在实际分析中高频使用。本章将系统介绍如何应用逻辑运算符进行筛选,涵盖注意事项和简化方法,帮助新手快速上手。
逻辑与筛选(&)
逻辑与筛选要求多个条件同时满足,使用&运算符。每个条件需用括号包裹,以避免优先级问题。
示例代码:
import pandas as pd
# 创建示例DataFrame
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 22, 28],
'城市': ['北京', '上海', '北京', '广州']
})
# 筛选条件:年龄大于25且城市为北京
filtered_df = df[(df['年龄'] > 25) & (df['城市'] == '北京')]
print(filtered_df)
输出:
姓名 年龄 城市
2 王五 22 北京 # 注意:年龄22不大于25,所以无符合条件的数据,这里示例无输出,实际为空的DataFrame
修正示例:
# 修正条件:年龄大于20且城市为北京
filtered_df = df[(df['年龄'] > 20) & (df['城市'] == '北京')]
print(filtered_df)
输出:
姓名 年龄 城市
0 张三 25 北京
2 王五 22 北京
逻辑或筛选(|)
逻辑或筛选要求至少一个条件满足,使用|运算符。同样需要使用括号确保表达式正确。
示例代码:
# 筛选条件:年龄大于28或城市为上海
filtered_df = df[(df['年龄'] > 28) | (df['城市'] == '上海')]
print(filtered_df)
输出:
姓名 年龄 城市
1 李四 30 上海
逻辑非筛选(~)
逻辑非筛选用于排除不满足某个条件的数据,使用~运算符。它可以反转布尔序列。
示例代码:
# 筛选条件:城市不为北京
filtered_df = df[~(df['城市'] == '北京')]
print(filtered_df)
输出:
姓名 年龄 城市
1 李四 30 上海
3 赵六 28 广州
多条件筛选的注意事项
在组合多条件时,需注意以下几点,以避免常见错误:
- 括号优先级:在Python中,比较运算符(如
>、==)优先级高于&和|,但低于and和or。因此,必须用括号包裹每个条件,例如(df['年龄'] > 25) & (df['城市'] == '北京'),而不是df['年龄'] > 25 & df['城市'] == '北京',后者会因运算符优先级导致错误。 - 条件表达式规范:确保每个条件返回布尔序列,且长度与DataFrame一致。例如,避免混合不同类型或使用无效列名。
- 组合复杂性:随着条件增多,表达式可能变得冗长。建议使用括号分组条件,提高可读性。
多条件筛选的简化方法:query方法
query方法允许使用字符串表达式进行筛选,代码更简洁,推荐在高频筛选场景中使用。它支持类似Python的表达式,但以字符串形式传递。
示例代码:
# 使用query方法筛选:年龄大于25且城市为北京
filtered_df = df.query('年龄 > 25 and 城市 == "北京"')
print(filtered_df)
输出:
姓名 年龄 城市
2 王五 22 北京 # 注意:年龄22不大于25,无符合条件数据,示例为空
修正示例:
# 修正条件:年龄大于20且城市为北京
filtered_df = df.query('年龄 > 20 and 城市 == "北京"')
print(filtered_df)
输出:
姓名 年龄 城市
0 张三 25 北京
2 王五 22 北京
为什么推荐query方法:
- 语法更接近自然语言,易于理解和维护。
- 避免了复杂的括号嵌套,减少错误。
- 支持列名中的空格等特殊情况,但需用反引号包裹(例如
query('年龄> 25'))。
总结
多条件筛选是Pandas数据分析的核心技能。通过掌握逻辑运算符和query方法,你可以高效处理复杂筛选需求。记住使用括号确保优先级,并尝试简化代码以提升效率。练习这些技巧,将在实战中更得心应手。
开发工具推荐