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.

Recorriendo los valores de los nombres de las columnas y buscando la coincidencia exacta con una lista de cadenas en otra columna.

Este es un ejemplo de df6:

df6 = pd.DataFrame({
                   'answer1': ['Lo', 'New York', 'Toronto'],
                   'answer2': ['London', 'New', 'Paris'],
                   'answer3': ['CA', 'CA', 'CA'],
                   'correct': [["'London'", "'CA'"], ["'New York'"], ["'Toronto'"]]
                   })

df6 genera:

   answer1   answer2     answer3     correct
0   Lo         London         CA    ['London','CA']
1   New York    New           CA    ['New York']
2   Toronto    Paris          CA    ['Toronto']

Lo que estoy intentando hacer es comparar la respuesta exacta de las columnas que tienen el nombre “answer” con la columna “correct”, y si coinciden, se agregará el nombre de la columna a una nueva columna.

Mi problema es que no encuentro el enfoque correcto para hacerlo.

Esto es lo que he intentado, incluso con la ayuda de otros miembros de SO:

cols = df6.filter(like='answer').columns

df6['Answer'] = df6[cols].apply(lambda s: ', '.join(cols[(m:=[str(s[col]) in str(df6.loc[s.name, 'correct']) for col in cols])]) , axis=1)

Este código produce:

    answer1    answer2     answer3     correct               Answer
0   Lo         London       CA         ['London','CA']        answer1, answer2,answer3
1   New York   New          CA         ['New York']           answer1, answer2
2   Toronto    Paris        CA         ['Toronto']            answer1

El resultado en la fila 0 no es exacto porque la columna Answer debería tener solo answer2, answer3 que coinciden con ['London','CA']… lo mismo sucede para la fila 1.

Entonces, al comparar los resultados, creo que debería usar == en lugar de in:

[str(s[col]) in str(df6.loc[s.name, 'correct'])

Tenga en cuenta que tuve que envolver todo en str para solucionar problemas de tipos de datos mientras se compara.

El resultado deseado es:

   answer1    answer2     answer3     correct                 Answer
0   Lo         London       CA         ['London','CA']        answer2, answer3
1   New York   New          CA         ['New York']           answer1
2   Toronto    Paris        CA         ['Toronto']            answer1
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes modificar la función lambda dentro del método apply de la siguiente manera:

    df6['Answer'] = df6.apply(lambda row: 
                              [col for col in row[cols].index if str(row[col]) in row['correct']] , 
                              axis=1)
    

    Esto iterará sobre cada fila en el dataframe y, para cada fila, verificará si los valores en las columnas con “answer” en el nombre están presentes en la columna “correct”. Si un valor está presente, se agregará el nombre de la columna a una lista. Finalmente, se asignará la lista a la columna “Answer”.

    El dataframe resultante será:

        answer1   answer2 answer3       correct            Answer
    0        Lo    London      CA  [London, CA]       [answer2, answer3]
    1  New York       New      CA  [New York]             [answer1]
    2   Toronto     Paris      CA  [Toronto]              [answer1]
    

Comments are closed.