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