我正在处理熊猫中的布尔索引
问题是为什么会有这样的声明:
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。这就是&二进制运算符执行以下操作:
(a['x']==1)&;(a['y']==10)
返回一个布尔数组
顺便说一下,正如alexpmil所指出的,
括号是必需的,因为&的运算符优先级高于==
如果没有括号,a['x']==1&;一个['y']==10将被评估为a['x']==(1&a['y'])==10,这将反过来相当于链式比较(a['x']==(1&a['y'])和((1&a['y'])==10。这是系列和系列形式的表达式。
对两个系列使用和将再次触发与上述相同的值错误。这就是为什么括号是强制性的