Один из методов заключается в том, чтобы сохранить результат внутренней формы слияния как dfs, тогда мы можем просто выбрать строки, когда значения одного столбца не входят в это общее:
In [119]:
common = df1.merge(df2,on=['col1','col2'])
print(common)
df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))]
col1 col2
0 1 10
1 2 11
2 3 12
Out[119]:
col1 col2
3 4 13
4 5 14
EDIT
Другой метод, который вы нашли, - это использовать isin
, который приведет к появлению NaN
строк, которые вы можете удалить:
In [138]:
df1[~df1.isin(df2)].dropna()
Out[138]:
col1 col2
3 4 13
4 5 14
Однако, если df2 не запускает строки таким же образом то это не сработает:
df2 = pd.DataFrame(data = {'col1' : [2, 3,4], 'col2' : [11, 12,13]})
будет генерировать весь df:
In [140]:
df1[~df1.isin(df2)].dropna()
Out[140]:
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14