在 PYSPARK 中旋转数据框
Pivoting Data-frame in PYSPARK
我有如下需求
数据帧
id code
R101,GTR001
R201,RTY987
R301,KIT158
R201,PLI564
R101,MJU098
R301,OUY579
每个 id
可以有很多 code
(不只是两个)。
预期的输出应该如下所示。
id col1 col2 col3 col4 col5 col6
R101 GTR001 MJU098 null null null null
R201 null null RTY987 PLI564 null null
R301 null null null null KIT158 OUY579
此处特定 id
的列取决于分配给 id
的 code
的数量,即在 col1
和 col2
代码下 R101
应填充,在 col3
和 col4
下应填充 R201
的代码,其余 ID 也是如此。
您可以尝试根据 id 对代码字段进行排名并将排名用于 pivoting.Hope 这有帮助,
df = spark.createDataFrame([('R101','GTR001'),('R201','RTY987'),('R301','KIT158'),('R201','PLI564'),('R101','MJU098'),('R301','OUY579')],['id','code'])
df.show()
+----+------+
| id| code|
+----+------+
|R101|GTR001|
|R201|RTY987|
|R301|KIT158|
|R201|PLI564|
|R101|MJU098|
|R301|OUY579|
+----+------+
from pyspark.sql import functions as F
from pyspark.sql import Window
df = df.withColumn('rank',F.dense_rank().over(Window.orderBy("id","code")))
df.withColumn('combcol',F.concat(F.lit('col_'),df['rank'])).groupby('id').pivot('combcol').agg(F.first('code')).show()
+----+------+------+------+------+------+------+
| id| col_1| col_2| col_3| col_4| col_5| col_6|
+----+------+------+------+------+------+------+
|R101|GTR001|MJU098| null| null| null| null|
|R201| null| null|PLI564|RTY987| null| null|
|R301| null| null| null| null|KIT158|OUY579|
+----+------+------+------+------+------+------+
我有如下需求
数据帧
id code
R101,GTR001
R201,RTY987
R301,KIT158
R201,PLI564
R101,MJU098
R301,OUY579
每个 id
可以有很多 code
(不只是两个)。
预期的输出应该如下所示。
id col1 col2 col3 col4 col5 col6
R101 GTR001 MJU098 null null null null
R201 null null RTY987 PLI564 null null
R301 null null null null KIT158 OUY579
此处特定 id
的列取决于分配给 id
的 code
的数量,即在 col1
和 col2
代码下 R101
应填充,在 col3
和 col4
下应填充 R201
的代码,其余 ID 也是如此。
您可以尝试根据 id 对代码字段进行排名并将排名用于 pivoting.Hope 这有帮助,
df = spark.createDataFrame([('R101','GTR001'),('R201','RTY987'),('R301','KIT158'),('R201','PLI564'),('R101','MJU098'),('R301','OUY579')],['id','code'])
df.show()
+----+------+
| id| code|
+----+------+
|R101|GTR001|
|R201|RTY987|
|R301|KIT158|
|R201|PLI564|
|R101|MJU098|
|R301|OUY579|
+----+------+
from pyspark.sql import functions as F
from pyspark.sql import Window
df = df.withColumn('rank',F.dense_rank().over(Window.orderBy("id","code")))
df.withColumn('combcol',F.concat(F.lit('col_'),df['rank'])).groupby('id').pivot('combcol').agg(F.first('code')).show()
+----+------+------+------+------+------+------+
| id| col_1| col_2| col_3| col_4| col_5| col_6|
+----+------+------+------+------+------+------+
|R101|GTR001|MJU098| null| null| null| null|
|R201| null| null|PLI564|RTY987| null| null|
|R301| null| null| null| null|KIT158|OUY579|
+----+------+------+------+------+------+------+