Этого можно добиться с помощью функции pivot , за которой следует функция агрегирования.Я решил использовать max , но в зависимости от ваших данных могут использоваться другие функции, такие как avg .
from pyspark.sql.functions import max
l = [( 0, 4.0 , 4.2),
(0, 2.0, 2.7),
(0, 6.0, 3.0),
(1, 7.0, 2.3),
(1, 0.0, 0.5),
(2, 3.0, 3.1)]
columns = ['CustomerID', 'ProductID', 'Rating']
df=spark.createDataFrame(l, columns)
df = df.groupby('CustomerID').pivot('ProductID').agg(max("Rating"))
df.show()
Вывод:
+----------+----+----+----+----+----+----+
|CustomerID| 0.0| 2.0| 3.0| 4.0| 6.0| 7.0|
+----------+----+----+----+----+----+----+
| 0|null| 2.7|null| 4.2| 3.0|null|
| 1| 0.5|null|null|null|null| 2.3|
| 2|null|null| 3.1|null|null|null|
+----------+----+----+----+----+----+----+