【发布时间】:2019-10-07 16:01:00
【问题描述】:
我正在寻找SQL MINUS (AKA EXCEPT) operator 的最快和惯用的模拟。
这就是我的意思 - 给定两个 Pandas DataFrame,如下所示:
In [77]: d1
Out[77]:
a b c
0 0 0 1
1 0 1 2
2 1 0 3
3 1 1 4
4 0 0 5
5 1 1 6
6 2 2 7
In [78]: d2
Out[78]:
a b c
0 1 1 10
1 0 0 11
2 1 1 12
如何仅考虑列"a" 和"b" 来查找d1 MINUS d2 的结果以获得以下结果:
In [62]: res
Out[62]:
a b c
1 0 1 2
2 1 0 3
6 2 2 7
MVCE:
d1 = pd.DataFrame({
'a': [0, 0, 1, 1, 0, 1, 2],
'b': [0, 1, 0, 1, 0, 1, 2],
'c': [1, 2, 3, 4, 5, 6, 7]
})
d2 = pd.DataFrame({
'a': [1, 0, 1],
'b': [1, 0, 1],
'c': [10, 11, 12]
})
我尝试了什么:
In [65]: tmp1 = d1.reset_index().set_index(["a", "b"])
In [66]: idx = tmp1.index.difference(d2.set_index(["a","b"]).index)
In [67]: res = d1.loc[tmp1.loc[idx, "index"]]
In [68]: res
Out[68]:
a b c
1 0 1 2
2 1 0 3
6 2 2 7
它给了我正确的结果,但我觉得必须有一种更惯用和更好/更清洁的方法来实现这一点。
PS DataFrame.isin() 方法在这种情况下无济于事,因为它会产生错误的结果集
【问题讨论】:
标签: python sql pandas dataframe