Я ищу самый быстрый и идиоматический аналог оператора SQL MINUS (AKA EXCEPT) .
Вот что я имею в виду - учитывая два кадра данных панд следующим образом:
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
Как найти результат d1 MINUS d2
с учетом только столбцов "a"
и "b"
, чтобы получить следующий результат:
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 () в этом случае не поможет, так как даст неправильный набор результатов