Как преобразовать строки в несколько столбцов в pyspark? - PullRequest
0 голосов
/ 08 июля 2019

Как я могу преобразовать этот фрейм данных в этот желаемый фрейм данных?

Это мой входной фрейм данных:

 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 голосов
/ 08 июля 2019

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]|
+---+---+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...