使用列作为后缀在PYSPARK中透视 Dataframe

yws3nbqq  于 2022-09-21  发布在  Spark
关注(0)|答案(0)|浏览(77)

这个问题类似于我以前问过的问题(Pandas pivot ussing column as suffix),但这一次我需要使用PySpark而不是Pandas来解决。问题如下。

我有一个 Dataframe ,如下例所示:
ID|类型|Value_1|Value_2
-|-|
1234|A|1|2
1234|B|1|2
789|A|1|2
789|B|1|2
567|A|1|2

我想要转型,以获得以下几点:

ID|Value_1_A|Value_1_B|Value_2_A|Value_2_B
-|
1234|1|1|2|2
789|1|1|2|2
567|1||1|

总而言之:使用‘Type’列作为后缀复制值列,并将 Dataframe 转换为宽格式。

我能想到的一种解决方案是手动创建带有后缀的列,然后聚合。

我尝试过的其他解决方案都使用了如下所示的pyspark GroupeData Pivot函数:

import pandas as pd
df = spark.createDataFrame(pd.DataFrame({'Id': {0: 1234, 1: 1234, 2: 789, 3: 789, 4: 567},
                   'Type': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A'},
                   'Value_1': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
                   'Value_2': {0: 2, 1: 2, 2: 2, 3: 2, 4: 2}}))    
df.groupBy("Id").pivot("Type").avg().show()

此解决方案的问题是,结果 Dataframe 将包括重复3次的ID列,并且无法将列命名为添加类型作为后缀,因为它们的命名方式如下:

['Id',
 'A_avg(Id)',
 'A_avg(Value_1)',
 'A_avg(Value_2)',
 'B_avg(Id)',
 'B_avg(Value_1)',
 'B_avg(Value_2)']

我还尝试将值列指定给透视函数,如下所示

df.groupBy("Id").pivot("Type", values=["Value_1", "Value_2"]).avg().show()

这将删除多余的ID列,但其余列仅具有空值。

有没有什么高雅的方法来实现我在星火上尝试的变形?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题