如何在pyspark中将行转换为多列?

时间:2019-07-08 12:12:54

标签: pyspark

如何将该数据帧转换为所需的数据帧?

这是我的输入数据框:

 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

1 个答案:

答案 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]|
+---+---+----------+