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?
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étodoselect
dedf2
, lo cual no es lo que deseas hacer. En su lugar, debes extraer las preguntas dedf1
y usarlas para seleccionar las columnas correspondientes dedf2
. Así es como puedes modificar la última línea para que funcione:En este código,
df1.select('questions').first()[0]
extrae la lista de preguntas dedf1
, que luego se utiliza para seleccionar las columnas correspondientes dedf2
usando una comprensión de lista. Las columnas resultantes se pasan aconcat_ws
para concatenar sus valores. Finalmente, la columna resultante se agrega adf1
usandowithColumn
.