<p>当你说</p>
<pre><code>(a['x']==1) and (a['y']==10)
</code></pre>
<p>您隐式地要求Python将<code>(a['x']==1)</code>和<code>(a['y']==10)</code>转换为布尔值。</p>
<p>NumPy数组(长度大于1)和Pandas对象(如Series)没有布尔值,换句话说,它们会提高</p>
<pre><code>ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().
</code></pre>
<p>当用作布尔值时。那是因为它的<a href="http://pandas.pydata.org/pandas-docs/dev/gotchas.html#using-if-truth-statements-with-pandas" rel="noreferrer">unclear when it should be True or False</a>。一些用户可能会假设它们是真的,如果它们具有非零长度,比如Python列表。其他人可能希望它是真的,只要它的所有元素都是真的。其他人可能希望它是真的,如果它的任何元素都是真的。</p>
<p>因为有太多相互矛盾的期望,NumPy和Pandas的设计者拒绝猜测,反而提出了一个价值错误。</p>
<p>相反,您必须是显式的,通过调用<code>empty()</code>、<code>all()</code>或<code>any()</code>方法来指示您想要的行为。</p>
<p>然而,在这种情况下,看起来您不需要布尔求值,而是需要逻辑和。这就是<code>&</code>二进制运算符执行的操作:</p>
<pre><code>(a['x']==1) & (a['y']==10)
</code></pre>
<p>返回布尔数组。</p>
<hr/>
<p>顺便说一下,作为<a href="https://stackoverflow.com/questions/21415661/logic-operator-for-boolean-indexing-in-pandas/21415990?noredirect=1#comment77317569_21415990">alexpmil notes</a>,
括号是必需的,因为<code>&</code>的<a href="https://docs.python.org/3/reference/expressions.html#operator-precedence" rel="noreferrer">operator precedence</a>比<code>==</code>高。
如果没有圆括号,<code>a['x']==1 & a['y']==10</code>将被计算为<code>a['x'] == (1 & a['y']) == 10</code>,而这又相当于链式比较<code>(a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)</code>。这是<code>Series and Series</code>形式的表达式。
对两个序列使用<code>and</code>将再次触发与上面相同的<code>ValueError</code>。这就是为什么括号是强制性的。</p>