es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Se produjo un ValueError: no se puede reindexar desde un eje duplicado mientras se utiliza pandas df.ne.

Tengo dos dataframes como se muestra a continuación: df1 y df2

df1 =
            emp_name    emp_city    counts  
    emp_id              
    1       uno         ciudad1     3   
    2       dos         ciudad2     1   
    3       tres        ciudad3     1   

df2 =
            emp_name    emp_city    counts  
    emp_id              
    2       dos         ciudad2     1   
    2       dosxx       ciudad2     1   
    4       cuatro      ciudad4     1   

Nota: ’emp_id’ actúa como índice.

Cuando trato de comparar los dos dataframes df1 y df2, utilizando la utilidad df.ne, como se muestra a continuación,

df3 = df2.copy()
df3['mismatch_col'] = df2.ne(df1, axis=1).dot(df2.columns + ',').str[:-1])

Me encuentro con el siguiente error:

ValueError: no se puede reindexar desde un eje duplicado

Entiendo la razón de este error. Es porque tengo un índice duplicado que es emp_id = 2. Quiero mantener los duplicados. ¿Cómo puedo superar este error sin eliminar duplicados?
También descubrí que podemos codificar ignore_index=True (mientras concatenamos dos dataframes) para mantener los índices duplicados, pero ¿cómo puedo codificarlo en la utilidad df.ne?
La razón para agregar este fragmento de código dot(df2.columns + ',').str[:-1] en df.ne es proporcionar los nombres de las columnas (separadas por comas) que tienen valores diferentes en df1 y df2.
Cualquier ayuda en esto es muy apreciada. ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el error “ValueError: no se puede reindexar desde un eje duplicado” en la utilidad df.ne sin eliminar duplicados, se puede utilizar el método reset_index () en ambos dataframes antes de aplicar la utilidad. Esto asignará un nuevo índice único a cada fila, lo que evitará el problema del índice duplicado.

    Aquí hay un ejemplo de cómo hacerlo:

    df3 = df2.reset_index().copy()
    df1 = df1.reset_index()
    df3['mismatch_col'] = df3.set_index('emp_id').ne(df1.set_index('emp_id'), axis=1) \
                          .dot(df2.columns + ',').str[:-1].reset_index(drop=True)
    

    El método .reset_index () se utiliza para restablecer el índice de ambos dataframes a una nueva columna, que se llama ‘index’. Esto creará un índice único para cada fila.

    Después de restablecer el índice, podemos usar el método set_index () para establecer la columna ’emp_id’ como el nuevo índice para df3 y df1. Esto nos permitirá aplicar la utilidad df.ne para comparar los dos dataframes sin el problema del índice duplicado.

    El método reset_index (drop = True) se utiliza para restablecer el índice del resultado de la operación dot ().

    Finalmente, se agrega la columna ‘mismatch_col’ a df3 con los nombres de las columnas (separados por comas) que tienen valores diferentes en df1 y df2.

    Nota: El parámetro ignore_index = True funciona solo para la concatenación, y no para la utilidad df.ne.

Comments are closed.