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.

Pyspark: concatenar columnas donde el nombre es proporcionado en otra columna.

Tengo 2 DataFrames

df1=
+————–+
|preguntas |
+————–+
|[Q1, Q2] |
|[Q4, Q6, Q7] |
|… |
+—+———-+

df2=
+——————–+—+—+—+—+
| Q1| Q2| Q3| Q4| Q6| Q7 | … |Q25|
+——————–+—+—+—+—+
| 1| 0| 1| 0| 0| 1 | … | 1|
+——————–+—+—+—+—+

Me gustaría agregar en el primer DataFrame una nueva columna con el valor de todas las columnas definidas en df1.preguntas.

Resultado esperado

df1=
+————–++————–+
|preguntas |valores
+————–+—————+
|[Q1, Q2] |[1, 0] |
|[Q4, Q6, Q7] |[0, 0, 1] |
|… | |
+—+———-++————–+

Cuando hago

cols_to_link = [‘Q1’, ‘Q2’]
df2= df2.select([col for col in cols_to_link])\
df2 = df2.withColumn(‘value’, F.concat_ws(“”, *df2.columns))

la columna adicional es lo que quiero, pero no puedo hacerlo mezclando DataFrames.

También funciona cuando estoy con df2.

df2 = df2.select([col for col in df1.select(‘preguntas’).collect()[0][0]])\
df2 = df2.withColumn(‘value’, F.concat_ws(“”, *df2.columns))

Pero no cuando quiero ir desde df1.

df1= df1\
.withColumn(‘value’, F.concat_ws(“”, *df2.select([col for col in df1.select(‘preguntas’).collect()])))

¿Dónde estoy equivocado?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la última línea de código es que estás pasando toda la lista de preguntas de df1 al método select de df2, lo cual no es lo que deseas hacer. En su lugar, debes extraer las preguntas de df1 y usarlas para seleccionar las columnas correspondientes de df2. Así es como puedes modificar la última línea para que funcione:

    df1 = df1.withColumn('value', F.concat_ws(', ', *[df2[col] for col in df1.select('questions').first()[0]]))
    

    En este código, df1.select('questions').first()[0] extrae la lista de preguntas de df1, que luego se utiliza para seleccionar las columnas correspondientes de df2 usando una comprensión de lista. Las columnas resultantes se pasan a concat_ws para concatenar sus valores. Finalmente, la columna resultante se agrega a df1 usando withColumn.

Comments are closed.