Cómo eliminar filas del dataframe de Pandas si la misma fila existe en otro dataframe pero termina con todas las columnas de ambos df

Tengo dos marcos de datos Pandas diferentes que tienen una columna en común. He visto preguntas similares sobre el desbordamiento de stack pero ninguna que parece terminar con las columnas de ambos marcos de datos, así que lea a continuación antes de marcar como duplicado.

Ejemplo:

dataframe 1

ID col1 col2 ... 1 9 5 2 8 4 3 7 3 4 6 2 

dataframe 2

 ID col3 col4 ... 3 11 15 4 12 16 7 13 17 

Lo que quiero lograr es un dataframe con columnas de ambos marcos de datos pero sin los ID que se encuentran en el dataframe2. es decir:

resultado deseado:

 ID col1 col2 col3 col4 1 9 5 - - 2 8 4 - - 

¡Gracias!

Puede usar una combinación izquierda para obtener solo los id en el primer dataframe y no el segundo dataframe mientras mantiene todas las columnas de los segundos marcos de datos.

 import pandas as pd df1 = pd.DataFrame( data={"id": [1, 2, 3, 4], "col1": [9, 8, 7, 6], "col2": [5, 4, 3, 2]}, columns=["id", "col1", "col2"], ) df2 = pd.DataFrame( data={"id": [3, 4, 7], "col3": [11, 12, 13], "col4": [15, 16, 17]}, columns=["id", "col3", "col4"], ) df_1_2 = df1.merge(df2, on="id", how="left", indicator=True) df_1_not_2 = df_1_2[df_1_2["_merge"] == "left_only"].drop(columns=["_merge"]) 

que devuelve

  id col1 col2 col3 col4 0 1 9 5 NaN NaN 1 2 8 4 NaN NaN 

Parece que una simple drop funcionará para lo que quieres:

 df1.drop(df2.index, errors='ignore', axis=0) col1 col2 ID 1 9 5 2 8 4 

Tenga en cuenta que esto supone que ID es el índice; de ​​lo contrario, use .isin :

 df1[~df1.ID.isin(df2.ID)] ID col1 col2 0 1 9 5 1 2 8 4