【问题标题】:Pyspark One Hot EncodingPyspark One 热编码
【发布时间】:2021-01-25 09:04:12
【问题描述】:

我有一个示例数据,我想做 PySpark 版本的 str.get_dummies,但不知道该怎么做。

title_df:

    Film       Category
    LOTR        Drama, Fantasy
    STAR WARS   Sci-Fi, Action
    etc.

然后会给我:

    Film     Action  Fantasy  Drama  Sci-Fi  Romance  Comedy
    LOTR          0       1        1      0        0       0
    STAR WARS     1       0        0      1        0       0
    etc.

感谢您的帮助!

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    这是ML方式,例如:

    %python
    
    from pyspark.ml.feature import VectorAssembler, StringIndexer, OneHotEncoder
    
    stringIndexer = StringIndexer().setInputCol("ageCategory").setOutputCol("ageIndex")
    ageModel = stringIndexer.fit(df)
    df = ageModel.transform(df)
    

    【讨论】:

      【解决方案2】:

      你可以使用crosstab:

      import pyspark.sql.functions as F
      
      df2 = (df.select('Film', F.explode(F.split('Category', ', ')).alias('Category'))
               .distinct()
               .crosstab('Film', 'Category')
            )
      
      df2.show()
      +-------------+------+-----+-------+------+
      |Film_Category|Action|Drama|Fantasy|Sci-Fi|
      +-------------+------+-----+-------+------+
      |         LOTR|     0|    1|      1|     0|
      |    STAR WARS|     1|    0|      0|     1|
      +-------------+------+-----+-------+------+
      

      或者,如果您更喜欢经典的 Spark SQL 操作:

      df2 = (df.select('Film', F.explode(F.split('Category', ', ')).alias('Category'))
               .groupBy('Film')
               .pivot('Category')
               .agg(F.lit(1))
               .fillna(0)
            )
      

      【讨论】:

      • 我不知道这个crosstab 函数。非常好。谢谢 :)
      • @Steven 它只是 groupby pivot 和 count 的语法糖 :) 虽然我很少找到它的用例
      猜你喜欢
      • 2016-02-14
      • 2023-03-04
      • 2017-10-23
      • 2019-05-23
      • 2019-04-06
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多