将多标签列转换为 pyspark 中的多列?
Convert a multi-label column to multiple columns in pyspark?
我有一个像这样的 pyspark 数据框-
这是我要解决的问题的简化版本。事实上,"label" 列在一行中可能有多达 20 个项目(将是字符串)。现在我们只有 3 个选项可供选择,即 0、1 和 2。
对于图中所示的问题,我想要的是另外三列——label_0、label_1和label_2。例如,table 转换后会变成这样。
这可能看起来类似于进行单热编码。我发现在 pyspark 中很难做到这一点。
对于Spark2.4+
,你可以试试这个。
labels=['0','1','2']
from pyspark.sql import functions as F
df.withColumn("struct", F.struct(*[(F.struct(F.expr("size(filter(label,x->x={}))"\
.format("'"+y+"'"))).alias(y)) for y in labels]))\
.select("id",*[F.col("struct.{}.col1".format(x)).alias('label'+x) for x in labels]).show()
#+---+------+------+------+
#| id|label0|label1|label2|
#+---+------+------+------+
#| 0| 0| 1| 1|
#| 1| 1| 1| 0|
#| 2| 1| 1| 0|
#| 3| 1| 1| 0|
#+---+------+------+------+
我有一个像这样的 pyspark 数据框-
这是我要解决的问题的简化版本。事实上,"label" 列在一行中可能有多达 20 个项目(将是字符串)。现在我们只有 3 个选项可供选择,即 0、1 和 2。
对于图中所示的问题,我想要的是另外三列——label_0、label_1和label_2。例如,table 转换后会变成这样。
这可能看起来类似于进行单热编码。我发现在 pyspark 中很难做到这一点。
对于Spark2.4+
,你可以试试这个。
labels=['0','1','2']
from pyspark.sql import functions as F
df.withColumn("struct", F.struct(*[(F.struct(F.expr("size(filter(label,x->x={}))"\
.format("'"+y+"'"))).alias(y)) for y in labels]))\
.select("id",*[F.col("struct.{}.col1".format(x)).alias('label'+x) for x in labels]).show()
#+---+------+------+------+
#| id|label0|label1|label2|
#+---+------+------+------+
#| 0| 0| 1| 1|
#| 1| 1| 1| 0|
#| 2| 1| 1| 0|
#| 3| 1| 1| 0|
#+---+------+------+------+