如何将该数据帧转换为所需的数据帧?
这是我的输入数据框:
C1 C2 C3 C4
---------------------
2018 2 3 0.8
2019 4 1 0.2
2020 2 3 0.1
2021 10 1 0.5
这是我想要的输出数据帧:
C2 C3 2018 2019 2020 2021
------------------------------
2 3 0.8 null 0.1 null
4 1 null 0.2 null null
2 8 null null null null
10 1 null null null 0.5
答案 0 :(得分:0)
pivot
是您要寻找的功能。
df = spark.createDataFrame([
[2018, 2, 3, 0.8],
[2019, 4, 1, 0.2],
[2020, 2, 3, 0.1],
[2021, 10, 1, 0.5]
], ['C1', 'C2', 'C3', 'C4'])
df.show()
>>>
+----+---+---+---+
| C1| C2| C3| C4|
+----+---+---+---+
|2018| 2| 3|0.8|
|2019| 4| 1|0.2|
|2020| 2| 3|0.1|
|2021| 10| 1|0.5|
+----+---+---+---+
df2 = df.groupBy('C2', 'C3').pivot('C1').avg('C4')
df2.show()
>>>
+---+---+----+----+----+----+
| C2| C3|2018|2019|2020|2021|
+---+---+----+----+----+----+
| 2| 3| 0.8|null| 0.1|null|
| 10| 1|null|null|null| 0.5|
| 4| 1|null| 0.2|null|null|
+---+---+----+----+----+----+
尽管您没有提到如果发生以下情况该怎么办:
+----+---+---+---+
| C1| C2| C3| C4|
+----+---+---+---+
|2018| 2| 3|0.8|
|2018| 2| 3|0.3|
+----+---+---+---+
您可以通过更改GroupedData聚合功能来更改行为(请参见http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.GroupedData)。如果要收集所有值,可以使用:
from pyspark.sql import functions as F
df2 = df.groupBy('C2', 'C3').pivot('C1').agg(F.collect_list('C4'))
df2.show()
>>>
+---+---+----------+
| C2| C3| 2018|
+---+---+----------+
| 2| 3|[0.8, 0.3]|
+---+---+----------+