Spark - 单列到 X 列 类

Spark - Single column to columns of X classes

目前,我有一个单列的数据框,如下所示

 color
 -----
 green
 blue
 green
 red
 yellow
 red
 orange

等等...(30种不同的颜色)。

从该专栏,我想将其转换为类似于此的 DataFrame

green blue red yellow orange purple ... more colors
  1     0   0     0     0       0
  0     1   0     0     0       0
  1     0   0     0     0       0
  0     0   1     0     0       0
  0     0   0     1     0       0
  0     0   1     0     0       0
  0     0   0     0     1       0

每个变量都设置为 0 的 DataFrame,除了与原始列位于同一索引上的颜色。

到目前为止,我已经尝试了不同的函数和解决方案,其中 none 有效(而且代码看起来真的很乱)。我想知道是否有 "easy" 或简单的方法来执行此操作,或者我应该使用另一个库,如 Pandas(我正在使用 Python)。如果你知道 R,那么我想要的是 table 函数。

谢谢

像这样应该可以解决问题:

from pyspark.sql.functions import when, lit, col

colors = df.select("color").distinct().map(lambda x: x[0]).collect()
cols = (
    when(col("color") == lit(color), 1).otherwise(0).alias(color)
    for color in colors
)

df.select(*cols)

如果您正在寻找类似于 R table 的另一种解决方案,您可能想看看 crosstab and cube

备注

当级别数很大时,创建密集数据框变得相当低效。在这种情况下,您应该考虑使用稀疏向量:

from pyspark.sql import Row
from pyspark.mllib.linalg import Vectors
from pyspark.ml.feature import StringIndexer

def toVector(n): 
    def _toVector(i):
        return Row("vec")(Vectors.sparse(n, {i: 1.0}))
    return _toVector

indexer = StringIndexer(inputCol="color", outputCol="colorIdx")
indexed = indexer.fit(df).transform(df)
n = indexed.select("colorIdx").distinct().count()

vectorized = indexed.select("colorIdx").map(toVector(n)).toDF()