You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中筛选多列含指定值的DataFrame子集?

Pandas筛选含指定值行的解决方案

问题背景

给定以下Pandas DataFrame:

A  age  B   C   D   E
0            0   58  0   1   0   0   
1            0   45  0   0  99   0   
2            1   41  0   1   1   0   
3            0   53  0   1  99  99   
4            0   28  0  99   0  99   

需求是筛选出B、C、D、E任意一列值为99的行,预期结果如下:

A  age  B   C   D   E   
1            0   45  0   0  99   0      
3            0   53  0   1  99  99   
4            0   28  0  99   0  99 

尝试执行以下代码时触发错误:

df99 = df[df['B'] == 99 or df['C'] == 99 or df['D'] == 99 or df['E'] == 99]

报错信息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

错误原因

Python原生的or是逻辑运算符,无法直接作用于Pandas的Series对象——因为Series是一组布尔值,无法直接判断整个Series的真假,因此会抛出歧义错误。Pandas需要使用**按位或运算符|**来处理Series之间的逻辑或操作。

正确实现方法

方法1:使用按位或|

注意每个条件必须用括号包裹,避免运算符优先级问题:

df99 = df[(df['B'] == 99) | (df['C'] == 99) | (df['D'] == 99) | (df['E'] == 99)]

方法2:简洁的isin+any写法

当需要筛选的列较多时,这种写法更高效简洁:

# 指定要检查的列
target_cols = ['B', 'C', 'D', 'E']
# 检查指定列是否包含99,按行判断是否有至少一个符合条件
df99 = df[df[target_cols].isin([99]).any(axis=1)]

方法3:eq+any写法

和方法2逻辑一致,用eq()方法直接判断等于99:

target_cols = ['B', 'C', 'D', 'E']
df99 = df[df[target_cols].eq(99).any(axis=1)]

以上三种方法都能得到预期的筛选结果,其中方法2和3更适合列数较多的场景,代码可读性和维护性更强。

内容的提问来源于stack exchange,提问作者Luke Haws

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:05:24