Aplicar una transformación a múltiples columnas pyspark dataframe

Supongamos que tengo el siguiente marco de datos de chispa:

+-----+-------+
| word|  label|
+-----+-------+
|  red|  color|
|  red|  color|
| blue|  color|
| blue|feeling|
|happy|feeling|
+-----+-------+

Que se puede crear usando el siguiente código:

sample_df = spark.createDataFrame([
        ('red', 'color'),
        ('red', 'color'),
        ('blue', 'color'),
        ('blue', 'feeling'),
        ('happy', 'feeling')
    ],
    ('word', 'label')
)

Puedo realizar ungroupBy() para obtener los recuentos de cada par de etiquetas de palabras:

sample_df = sample_df.groupBy('word', 'label').count()
#+-----+-------+-----+
#| word|  label|count|
#+-----+-------+-----+
#| blue|  color|    1|
#| blue|feeling|    1|
#|  red|  color|    2|
#|happy|feeling|    1|
#+-----+-------+-----+

Y entoncespivot() ysum() para obtener la etiqueta cuenta como columnas:

import pyspark.sql.functions as f
sample_df = sample_df.groupBy('word').pivot('label').agg(f.sum('count')).na.fill(0)
#+-----+-----+-------+
#| word|color|feeling|
#+-----+-----+-------+
#|  red|    2|      0|
#|happy|    0|      1|
#| blue|    1|      1|
#+-----+-----+-------+

¿Cuál es la mejor manera de transformar esto?dataframe tal que cada fila se divide por el total de esa fila?

# Desired output
+-----+-----+-------+
| word|color|feeling|
+-----+-----+-------+
|  red|  1.0|    0.0|
|happy|  0.0|    1.0|
| blue|  0.5|    0.5|
+-----+-----+-------+

Una forma de lograr este resultado es usar__builtin__.sum (NOpyspark.sql.functions.sum) para obtener la suma en filas y luego llamarwithColumn() para cada etiqueta:

labels = ['color', 'feeling']

sample_df.withColumn('total', sum([f.col(x) for x in labels]))\
    .withColumn('color', f.col('color')/f.col('total'))\
    .withColumn('feeling', f.col('feeling')/f.col('total'))\
    .select('word', 'color', 'feeling')\
    .show()

Pero tiene que haber una mejor manera que enumerar cada una de las columnas posibles.

En general, mi pregunta es:

¿Cómo puedo aplicar una transformación arbitraria, que es una función de la fila actual, a varias columnas simultáneamente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta