在数据分析中,我们常常要从DataFrame里挑出符合特定要求的行。Pandas提供了非常直观的布尔索引机制,让按条件选行变得简单。理解它的工作方式,能避免很多常见错误。
![Pandas怎么按条件选行?df[df['age']]>18布尔索引与多条件(&/|)用法详解](/upload/union/20260724/1784905752343487.jpg)
什么是布尔索引
布尔索引是指用一个长度与DataFrame行数相同的布尔序列(True或False)去对行进行筛选。Pandas会保留值为True的行,丢弃值为False的行。
例如,我们有一个记录用户信息的表,想选出年龄大于18的人:
import pandas as pd
data = {
'name': ['Tom', 'Lucy', 'Jack', 'Anna'],
'age': [15, 20, 25, 17]
}
df = pd.DataFrame(data)
# 单条件布尔索引:年龄大于18
mask = df['age'] > 18
print(mask)
# 0 False
# 1 True
# 2 True
# 3 False
# 用布尔序列筛选行
result = df[mask]
print(result)
上面代码中,df['age'] > 18返回一个布尔Series,再把它传给df[...]就完成了筛选。
直接使用df[df['age']>18]的写法
实际写代码时,我们通常会把两步合并,直接写成:
# 直接内联布尔条件 adults = df[df['age'] > 18] print(adults)
这个表达式先计算df['age'] > 18得到布尔序列,再用它索引df,效果和分步写完全一致。
多条件筛选:使用&和|
当需要满足多个条件时,要用按位运算符&(与)和|(或),并且每个条件都必须用括号包起来,否则会因为运算符优先级出问题。
多条件且(&)
选出年龄大于18且名字不为Anna的行:
# 多条件:年龄>18 且 名字不是Anna filtered = df[(df['age'] > 18) & (df['name'] != 'Anna')] print(filtered)
多条件或(|)
选出年龄小于18或年龄大于22的行:
# 多条件:年龄<18 或 年龄>22 filtered_or = df[(df['age'] < 18) | (df['age'] > 22)] print(filtered_or)
常见错误提醒
- 不要使用Python关键字and或or来连接条件,它们不支持Series间的逐元素运算,会直接报错。
- 忘记给单个条件加括号,会导致运算符优先级错误,得到非预期结果。
- 使用
==判断字符串或数值相等时,同样要放在括号内参与&或|运算。
使用query方法作为替代
如果不习惯写很多括号,也可以用DataFrame的query方法,以字符串形式写条件:
# 使用query写多条件
res = df.query("age > 18 and name != 'Anna'")
print(res)
这种方式可读性更好,但在复杂逻辑或列名带空格时需谨慎处理。
小结
掌握df[df['col'] > val]这类布尔索引写法,是Pandas数据处理的基本功。记住多条件用&和|并加括号,就能准确按条件选行,提升分析效率。