#python-3.x #pyspark #apache-spark-sql #pyspark-dataframes
#python-3.x #pyspark #apache-spark-sql #pyspark-dataframes
Вопрос:
У меня есть PySpark dataframe-
df = spark.createDataFrame([
("u1", 0),
("u2", 0),
("u3", 1),
("u4", 2),
("u5", 3),
("u6", 2),],
['user_id', 'medals'])
df.show()
Вывод-
------- ------
|user_id|medals|
------- ------
| u1| 0|
| u2| 0|
| u3| 1|
| u4| 2|
| u5| 3|
| u6| 2|
------- ------
Я хочу получить распределение столбца medals для всех пользователей. Итак, если в столбце medals есть n уникальных значений, я хочу, чтобы в выходном фрейме данных было n столбцов с соответствующим количеством пользователей, получивших столько медалей.
Выходные данные для приведенных выше данных должны выглядеть следующим образом-
------- -------- -------- --------
|medals_0|medals_1|medals_2|medals_3|
-------- -------- -------- --------
| 2| 1| 2| 1|
-------- -------- -------- --------
Как мне этого добиться?
Ответ №1:
это простой pivot
:
df.groupBy().pivot("medals").count().show()
--- --- --- ---
| 0| 1| 2| 3|
--- --- --- ---
| 2| 1| 2| 1|
--- --- --- ---
если вам нужно какое-то косметическое средство для добавления слова medals в название столбца, вы можете сделать это :
medals_df = df.groupBy().pivot("medals").count()
for col in medals_df.columns:
medals_df = medals_df.withColumnRenamed(col, "medals_{}".format(col))
medals_df.show()
-------- -------- -------- --------
|medals_0|medals_1|medals_2|medals_3|
-------- -------- -------- --------
| 2| 1| 2| 1|
-------- -------- -------- --------