<p>对于布尔逻辑,使用<code>&</code>和<code>|</code>。</p>
<pre><code>np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
>>> df
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
2 0.950088 -0.151357 -0.103219
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
>>> df.loc[(df.C > 0.25) | (df.C < -0.25)]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
</code></pre>
<p>要查看发生了什么,您可以为每个比较得到一列布尔值,例如</p>
<pre><code>df.C > 0.25
0 True
1 False
2 False
3 True
4 True
Name: C, dtype: bool
</code></pre>
<p>当有多个条件时,将返回多个列。这就是连接逻辑不明确的原因。使用<code>and</code>或<code>or</code>分别处理每个列,因此首先需要将该列减少为一个布尔值。例如,查看每个列中的任何值或所有值是否为真。</p>
<pre><code># Any value in either column is True?
(df.C > 0.25).any() or (df.C < -0.25).any()
True
# All values in either column is True?
(df.C > 0.25).all() or (df.C < -0.25).all()
False
</code></pre>
<p>实现相同功能的一个复杂方法是将所有这些列压缩到一起,并执行适当的逻辑。</p>
<pre><code>>>> df[[any([a, b]) for a, b in zip(df.C > 0.25, df.C < -0.25)]]
A B C
0 1.764052 0.400157 0.978738
1 2.240893 1.867558 -0.977278
3 0.410599 0.144044 1.454274
4 0.761038 0.121675 0.443863
</code></pre>
<p>有关详细信息,请参阅文档中的<a href="http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing">Boolean Indexing</a>。</p>