<p>还有一种选择:</p>
<pre><code>df[~((df[['A', 'B']].duplicated(keep=False)) & (df.isnull().any(axis=1)))]
# A B Col_1 Col_2
# 0 1 a NaN 2
# 1 2 b A 2
# 2 3 c A 3
# 4 4 d B 3
# 6 5 e B 4
# 7 6 f NaN 4
# 8 7 g NaN 5
</code></pre>
<p>这使用按位的“not”运算符<code>~</code>对满足作为重复行的联合条件的行求反(参数<code>keep=False</code>使方法对所有非唯一行求值为True),并且至少包含一个空值。因此,表达式<code>df[['A', 'B']].duplicated(keep=False)</code>返回以下序列:</p>
^{pr2}$
<p>…表达式<code>df.isnull().any(axis=1)</code>返回以下序列:</p>
<pre><code># 0 True
# 1 False
# 2 False
# 3 True
# 4 False
# 5 True
# 6 False
# 7 True
# 8 True
</code></pre>
<p>。。。我们把这两个都用括号括起来(每当在索引操作中使用多个表达式时,Pandas语法都需要),然后再将它们括在括号中<em>中</em>,这样我们就可以否定整个表达式(即<code>~( ... )</code>),如下所示:</p>
<pre><code>~((df[['A','B']].duplicated(keep=False)) & (df.isnull().any(axis=1))) & (df['Col_2'] != 5)
# 0 True
# 1 True
# 2 True
# 3 False
# 4 True
# 5 False
# 6 True
# 7 True
# 8 False
</code></pre>
<p>您可以进一步使用逻辑运算符<code>&</code>和{<cd7>}(“或”运算符)来构建更复杂的条件。与SQL一样,根据需要使用附加括号对条件进行分组;例如,根据逻辑“条件X</em>和<em>条件Y</em>都为真,或者<em>条件Z</em>为真”并使用<code>df[ ( (X) & (Y) ) | (Z) ]</code>进行过滤。在</p>