Pandas中基于多列筛选行:两种命令为何结果不同?
Pandas筛选两列均大于0的行:两种写法的差异解析
首先创建示例DataFrame:
import pandas as pd a = [0,0,1,1,2,7] b = [1,0,0,1,1,4] df = pd.DataFrame(list(zip(a,b)), columns = ('a','b'))
生成的DataFrame如下:
a b 0 0 1 1 0 0 2 1 0 3 1 1 4 2 1 5 7 4
需求是筛选出a列和b列数值均大于0的所有行,但两种写法结果不同:
写法1:仅返回部分目标行
df[(df['a'] & df['b'])>0]
结果:
a b 3 1 1 5 7 4
写法2:返回全部目标行
df[((df['a']>0) & (df['b']>0))]
结果:
a b 3 1 1 4 2 1 5 7 4
差异原因
核心是**&的作用对象不同**:
- 写法1中,
df['a'] & df['b']是对两列的每个数值做按位与运算,而非逻辑判断。比如第4行的a=2(二进制10)和b=1(二进制01),按位与的结果是0,因此>0的判断为False,该行被过滤。 - 写法2中,先通过
df['a']>0和df['b']>0生成两个布尔序列(每个元素是True/False,代表是否大于0),再用&对这两个布尔序列做逻辑与运算,只要两列都大于0就保留该行,完全符合需求。
内容的提问来源于stack exchange,提问作者Levente
相关产品推荐
相关产品推荐

