Tengo dos marcos de datos de pandas que tienen algunas filas en común.
Supongamos que dataframe2 es un subconjunto de dataframe1.
¿Cómo puedo obtener las filas de dataframe1 que no están en dataframe2?
df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
Respuestas:
Un método sería almacenar el resultado de una combinación interna de ambos dfs, luego podemos simplemente seleccionar las filas cuando los valores de una columna no son tan comunes:
EDITAR
Otro método que haya encontrado es usar el
isin
que produciráNaN
filas que puede soltar:Sin embargo, si df2 no inicia filas de la misma manera, esto no funcionará:
producirá todo el df:
fuente
df1[~df1.isin(df2)].dropna(how = 'all')
Parece funcionar. Gracias de todos modos, su respuesta me ayudó a encontrar una solución.isin
requiere que ambos dfs comiencen con los mismos valores de fila, por ejemplo, si df2 eradf2 = pd.DataFrame(data = {'col1' : [2, 3,4], 'col2' : [11,12, 13]})
su método no funcionaríakeep=False
:df0.append(df1).drop_duplicates(keep=False)
por defecto mantiene el primer duplicado, desea eliminar todos los duplicadosLa solución actualmente seleccionada produce resultados incorrectos. Para resolver correctamente este problema, podemos realizar una unión izquierda desde
df1
hastadf2
, asegurándonos de obtener primero solo las filas únicas paradf2
.Primero, necesitamos modificar el DataFrame original para agregar la fila con datos [3, 10].
Realice una unión izquierda, eliminando duplicados
df2
para que cada fila dedf1
uniones con exactamente 1 fila dedf2
. Use el parámetroindicator
para devolver una columna adicional que indique de qué tabla era la fila.Crear una condición booleana:
¿Por qué otras soluciones están mal?
Algunas soluciones cometen el mismo error: solo verifican que cada valor sea independiente en cada columna, no juntos en la misma fila. Agregar la última fila, que es única pero tiene los valores de ambas columnas,
df2
expone el error:Esta solución obtiene el mismo resultado incorrecto:
fuente
df_all[df_all['_merge'] == 'left_only']
tener un df con los resultadosSuponiendo que los índices son consistentes en los marcos de datos (sin tener en cuenta los valores reales de col):
fuente
df1
cuales los índices NO estándf2.index
". Más información sobre la negación: stackoverflow.com/q/19960077/304209 (sorprendentemente, no pude encontrar ninguna mención de tilde en los documentos de pandas).ValueError: Item wrong length x instead of y.
Como ya se insinuó, isin requiere que las columnas y los índices sean los mismos para una coincidencia. Si la coincidencia solo debe estar en el contenido de la fila, una forma de obtener la máscara para filtrar las filas presentes es convertir las filas en un Índice (Multi):
Si se debe tener en cuenta el índice, set_index tiene un argumento de palabra clave anexar para agregar columnas al índice existente. Si las columnas no se alinean, la lista (df.columns) se puede reemplazar con especificaciones de columna para alinear los datos.
alternativamente podría usarse para crear los índices, aunque dudo que esto sea más eficiente.
fuente
Suponga que tiene dos marcos de datos, df_1 y df_2 con múltiples campos (nombres de columna) y desea encontrar las únicas entradas en df_1 que no están en df_2 sobre la base de algunos campos (por ejemplo, fields_x, fields_y), siga los siguientes pasos.
Paso 1.Agregue una columna key1 y key2 a df_1 y df_2 respectivamente.
Paso 2. Combina los marcos de datos como se muestra a continuación. field_x y field_y son nuestras columnas deseadas.
Paso 3. Seleccione solo aquellas filas de df_1 donde key1 no es igual a key2.
Paso4.Drop key1 y key2.
Este método resolverá su problema y funciona rápido incluso con grandes conjuntos de datos. Lo he probado para marcos de datos con más de 1,000,000 de filas.
fuente
un poco tarde, pero puede valer la pena verificar el parámetro "indicador" de pd.merge.
Vea esta otra pregunta para ver un ejemplo: Compare PandaS DataFrames y devuelva las filas que faltan en la primera
fuente
puedes hacerlo usando el método isin (dict) :
Explicación:
fuente
También puede concat
df1
,df2
:y luego elimine todos los duplicados:
fuente
Qué tal esto:
fuente
Aquí hay otra forma de resolver esto:
O:
fuente
Mi forma de hacerlo implica agregar una nueva columna que sea única para un marco de datos y usar esto para elegir si se debe mantener una entrada
Esto hace que cada entrada en df1 tenga un código: 0 si es único para df1, 1 si está en ambos dataFrames. Luego usa esto para restringir a lo que quieres
fuente
fuente