Cómo encontrar el complemento de dos marcos de datos.

dados dos grandes marcos de datos, ¿hay algún código conciso y eficiente (evitar el uso directo de cualquier for loop ) que me permita obtener el complemento de estos dos marcos de datos?

Para mí, la forma más directa es calcular la union-intersection como se muestra en el ejemplo ingenuo a continuación, pero no sé cómo implementar esto en un lenguaje elegante de pandas o np

 df1= pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2= pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 'key2': ['K0', 'K0', 'K0', 'K0'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) intersection= pd.merge(df1, df2, how='inner',on=['key1', 'key2']) union=pd.merge(df1, df2, how='outer',on=['key1', 'key2']) complement=union-intersection 

Gracias por cualquier comentario y respuesta

A partir de esto:

 df1= pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K0', 'K1'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']}) df2= pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], 'key2': ['K0', 'K0', 'K0', 'K0'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']}) intersection = pd.merge(df1, df2, how='inner',on=['key1', 'key2']) union = pd.merge(df1, df2, how='outer',on=['key1', 'key2']) 

sindicato de impresión

  AB key1 key2 CD 0 A0 B0 K0 K0 C0 D0 1 A1 B1 K0 K1 NaN NaN 2 A2 B2 K1 K0 C1 D1 3 A2 B2 K1 K0 C2 D2 4 A3 B3 K2 K1 NaN NaN 5 NaN NaN K2 K0 C3 D3 

intersección de impresión

  AB key1 key2 CD 0 A0 B0 K0 K0 C0 D0 1 A2 B2 K1 K0 C1 D1 2 A2 B2 K1 K0 C2 D2 

unión-intersección prueba esto:

 union[union.isnull().any(axis=1)] AB key1 key2 CD 1 A1 B1 K0 K1 NaN NaN 4 A3 B3 K2 K1 NaN NaN 5 NaN NaN K2 K0 C3 D3