pyspark - 将 values 的 list 分配给 PySpark 中具有二进制 value 的列

对于给定的 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|
+---+--------+--------+--------+--------+--------+

相似文章

最新文章