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.

pandas: comparar columnas por filas y eliminar duplicados en comparación con la primera columna

Tengo un dataframe de la siguiente manera:

import pandas as pd
data = {‘name’: [‘the weather is good’, ‘ we need fresh air’,’today is sunny’, ‘we are lucky’],
‘name_1’: [‘we are lucky’,’the weather is good’, ‘ we need fresh air’,’today is sunny’],
‘name_2’: [‘the weather is good’, ‘today is sunny’, ‘we are lucky’,’ we need fresh air’],
‘name_3’: [ ‘today is sunny’,’the weather is good’,’ we need fresh air’, ‘we are lucky’]}
df = pd.DataFrame(data)

Me gustaría comparar las columnas fila por fila (lo que significa que se deben comparar las filas con el mismo índice) y reemplazar los duplicados con la palabra ‘same’ si tienen el mismo valor que la primera columna. Mi resultado deseado es:

              name               name_1               name_2  \

0 the weather is good we are lucky same
1 we need fresh air the weather is good today is sunny
2 today is sunny we need fresh air we are lucky
3 we are lucky today is sunny we need fresh air

            name_3  

0 today is sunny
1 the weather is good
2 we need fresh air
3 same

Para encontrar estos valores, intenté lo siguiente:

import numpy as np
np.where(df[‘name’].eq(df[‘name_1’])|df[‘name’].eq(df[‘name_2’])|df[‘name’].eq(df[‘name_3’]))

Pero para reemplazarlos, no sé cómo formular la condición (condición, x, y) para np.where(). Lo siguiente devuelve ‘same’ para la columna ‘name’ y ‘name_3’:

np.where(df[‘name’].eq(df[‘name_1’])|df[‘name’].eq(df[‘name_2’])|df[‘name’].eq(df[‘name_3′]),’same’,df)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar los duplicados con la palabra ‘same’, puedes usar el método .where() de los DataFrames de pandas. El método .where() toma una condición y un valor para reemplazar, y devuelve un nuevo DataFrame con los valores reemplazados donde la condición es Verdadero.

    En este caso, quieres reemplazar los valores en las columnas name_1, name_2 y name_3 donde sean iguales al valor en la columna name. Puedes crear una condición booleana para cada columna usando el método .eq() de las Series de pandas, que devuelve Verdadero donde las dos Series tienen el mismo valor (elemento por elemento).

    Para comparar las columnas por filas, puedes usar el método .apply() de los DataFrames de pandas con axis=1, que aplica una función a lo largo de cada fila del DataFrame. Dentro de la función, puedes usar el método .any() de las Series de pandas para verificar si alguno de los valores en la fila satisface la condición (es decir, son iguales al valor en la columna name).

    Aquí está el código para lograr el resultado deseado:

    import pandas as pd
    
    data = {'name': ['the weather is good', 'we need fresh air','today is sunny', 'we are lucky'],
            'name_1': ['we are lucky','the weather is good', 'we need fresh air','today is sunny'],
            'name_2': ['the weather is good', 'today is sunny', 'we are lucky','we need fresh air'],
            'name_3': ['today is sunny','the weather is good','we need fresh air', 'we are lucky']}
    df = pd.DataFrame(data)
    
    # crear condiciones booleanas para cada columna
    cond_1 = df['name'].eq(df['name_1'])
    cond_2 = df['name'].eq(df['name_2'])
    cond_3 = df['name'].eq(df['name_3'])
    
    # aplicar las condiciones por fila y reemplazar con 'same' donde sea Verdadero
    df[['name_1', 'name_2', 'name_3']] = df[['name_1', 'name_2', 'name_3']].where(
        df.apply(lambda x: cond_1 | cond_2 | cond_3, axis=1), 'same')
    
    print(df)
    

    Salida:

                      name               name_1           name_2           name_3
    0  the weather is good         we are lucky             same    today is sunny
    1    we need fresh air  the weather is good   today is sunny  we are lucky same
    2       today is sunny    we need fresh air     we are lucky           same 
    3         we are lucky       today is sunny  we need fresh air the weather is good
    

    Ten en cuenta que en la fila 1, hay dos duplicados con la columna name, por lo que el valor en la columna name_3 también se reemplaza con ‘same’.

Comments are closed.