对于给定的 ID,我有一个 pyspark 数据框,其列 Categories
的 list 为 values。看起来像这样,我们称之为 df1
:
ID | Categories
122 [16777277, 16777350, 16777483, 16777425, 16777303]
总共大约有 500 个类别,但我们可以在上面的示例中看到 ID 122 仅具有上述 5 个类别。我们称之为 df2.columns
我想将 list 中的每个 value 从 Categories
列转换为自己的列,如下所示(df3):
ID | 16777277 | 16777350 | 16777483 | 16777425 | 44444 | 55555 | .......
122 1 1 1 1 0 0
知道如何进行这种转变吗?我尝试使用 explode()
然后 pivot()
但是,这似乎错误地将 list values 映射到列。
我尝试了什么:
df1 = df1.withColumn('exploded', F.explode('Categories'))
pivoted = df1.groupby('ID').pivot('exploded').count()
提前致谢!
回答1
在正确的轨道上,作为 list、explode、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|
+---+--------+--------+--------+--------+--------+