<p>在由所需列构造的多索引上使用<code>isin</code>可以有效地执行此操作:</p>
<pre><code>df1 = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
'k': [1, 2, 2, 2, 2],
'l': ['a', 'b', 'a', 'a', 'd']})
df2 = pd.DataFrame({'c': ['A', 'C'],
'l': ['b', 'a']})
keys = list(df2.columns.values)
i1 = df1.set_index(keys).index
i2 = df2.set_index(keys).index
df1[~i1.isin(i2)]
</code></pre>
<p><a href="https://i.stack.imgur.com/CJLkf.png" rel="noreferrer"><img src="https://i.stack.imgur.com/CJLkf.png" alt="enter image description here"/></a></p>
<p>我认为这改进了@IanS的类似解决方案,因为它不假定任何列类型(即它可以处理数字和字符串)。</p>
<hr/>
<p>(以上答案是编辑。以下是我的初步回答)</p>
<p>有趣!这是我以前从未遇到过的。。。我可能会通过合并两个数组,然后删除定义<code>df2</code>的行来解决这个问题。下面是一个使用临时数组的示例:</p>
<pre><code>df1 = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
'k': [1, 2, 2, 2, 2],
'l': ['a', 'b', 'a', 'a', 'd']})
df2 = pd.DataFrame({'c': ['A', 'C'],
'l': ['b', 'a']})
# create a column marking df2 values
df2['marker'] = 1
# join the two, keeping all of df1's indices
joined = pd.merge(df1, df2, on=['c', 'l'], how='left')
joined
</code></pre>
<p><a href="https://i.stack.imgur.com/TvDMi.png" rel="noreferrer"><img src="https://i.stack.imgur.com/TvDMi.png" alt="enter image description here"/></a></p>
<pre><code># extract desired columns where marker is NaN
joined[pd.isnull(joined['marker'])][df1.columns]
</code></pre>
<p><a href="https://i.stack.imgur.com/CJLkf.png" rel="noreferrer"><img src="https://i.stack.imgur.com/CJLkf.png" alt="enter image description here"/></a></p>
<p>可能有一种不使用临时数组的方法,但是我想不出一种。只要你的数据不是很大,上面的方法应该是一个快速和充分的答案。</p>