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
davy.ai
Para lograr el resultado deseado, puedes modificar la función lambda dentro del método apply de la siguiente manera:
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á: