Pandas中布尔索引的逻辑运算符

我正在处理熊猫中的布尔索引

问题是为什么会有这样的声明:

a[(a['some\u column']==some\u number)&(a['some\u other\u column']==some\u other\u number)]

很好,但是

a[(a['some\u column']==某个数字)和(a['some\u other\u column']==某个其他数字)]

是否有错误退出

例如:

a=pd.DataFrame({'x':[1,1],'y':[10,20]})
In:a[(a['x']==1)&(a['y']==10)]
输出:xy
0  1  10
In:a[(a['x']==1)和(a['y']==10)]
Out:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

当你说

(a['x']==1)和(a['y']==10)

您隐式地要求Python将(a['x']==1)(a['y']==10)转换为布尔值

NumPy数组(长度大于1)和Pandas对象(如Series)没有布尔值——换句话说,它们提高了

ValueError:数组的真值不明确。使用a.empty、a.any()或a.all()

当用作布尔值时。那是因为不清楚什么时候是真是假。如果长度不为零(如Python列表),一些用户可能会认为它们是真的。其他人可能只希望它的所有元素都是真的。其他人可能希望它是真的,如果它的任何元素都是真的

因为有太多相互冲突的期望,NumPy和Pandas的设计师拒绝猜测,反而提出了一个错误

相反,您必须是显式的,通过调用empty()all()any()方法来指示您想要的行为

但是,在本例中,看起来您不需要布尔求值,而是需要元素方面的逻辑and。这就是&amp二进制运算符执行以下操作:

(a['x']==1)&(a['y']==10)

返回一个布尔数组


顺便说一下,正如alexpmil所指出的,
括号是必需的,因为&amp的运算符优先级高于==

如果没有括号,a['x']==1&一个['y']==10将被评估为a['x']==(1&a['y'])==10,这将反过来相当于链式比较(a['x']==(1&a['y'])和((1&a['y'])==10。这是系列和系列形式的表达式。
对两个系列使用将再次触发与上述相同的值错误。这就是为什么括号是强制性的

发表评论