Вы можете использовать функцию pivot класса GroupedData, так как вы работаете только с 1 и 0. Пример кода:
l =[( 115 ,'A' ),
( 116 , 'B' ),
( 118 , 'C' ),
( 121 , 'D' ),
( 125 , 'E' ),
( 127 , 'F' ),
( 127 , 'G' ),
( 127 , 'H' ),
( 136 , 'I' ),
( 136 , 'J' )]
df = spark.createDataFrame(l, ['id','concepts'])
df.groupBy('id').pivot('concepts').count().show()
приведет к следующему кадру данных:
+---+----+----+----+----+----+----+----+----+----+----+
| id| A| B| C| D| E| F| G| H| I| J|
+---+----+----+----+----+----+----+----+----+----+----+
|136|null|null|null|null|null|null|null|null| 1| 1|
|116|null| 1|null|null|null|null|null|null|null|null|
|115| 1|null|null|null|null|null|null|null|null|null|
|127|null|null|null|null|null| 1| 1| 1|null|null|
|118|null|null| 1|null|null|null|null|null|null|null|
|125|null|null|null|null| 1|null|null|null|null|null|
|121|null|null|null| 1|null|null|null|null|null|null|
+---+----+----+----+----+----+----+----+----+----+----+
При необходимости замените нулевые значения функцией fill