我有一个pyspark数据框架,其中列Categories
具有给定ID的值列表。看起来像这样,我们称之为df1
:
ID | Categories
122 [16777277, 16777350, 16777483, 16777425, 16777303]
总共大约有500个类别,但是我们可以在上面的例子中看到ID 122只有上面的5个类别。设它为df2.columns
我想把列表中的每个值从Categories
列转换成它自己的列,像这样(df3):
ID | 16777277 | 16777350 | 16777483 | 16777425 | 44444 | 55555 | .......
122 1 1 1 1 0 0
你知道怎么做这个转换吗?我尝试使用explode()
然后pivot()
,然而,这似乎不正确地将列表值映射到列。
What I tried:
df1 = df1.withColumn('exploded', F.explode('Categories'))
pivoted = df1.groupby('ID').pivot('exploded').count()
提前感谢!
在正确的轨道上,作为一个列表,爆炸,groupby和Pivot和lit(1)
df1=spark.createDataFrame([(122 , [16777277, 16777350, 16777483, 16777425, 16777303])],
('ID' , 'Categories'))
df1.withColumn('exploded', F.explode('Categories')).groupBy("ID").pivot("exploded").agg(F.lit(1)).na.fill(0).show()
+---+--------+--------+--------+--------+--------+
| ID|16777277|16777303|16777350|16777425|16777483|
+---+--------+--------+--------+--------+--------+
|122| 1| 1| 1| 1| 1|
+---+--------+--------+--------+--------+--------+