【问题标题】:Convert strings of tags to binary vector pyspark将标签字符串转换为二进制向量 pyspark
【发布时间】:2020-01-19 21:17:36
【问题描述】:

我的数据如下所示:

| Id | ----Tags---- | some_text |
| 0  | <a><b>       | ex1       |
| 1  | <a><c>       | ex2       |
| 2  | <b><c>       | ex3       |

我希望它最终看起来像这样:

| Id | a | b | c | some_text |
| 0  | 1 | 1 | 0 | ex1       |
| 1  | 1 | 0 | 1 | ex2       |
| 2  | 0 | 1 | 1 | ex3       |

我想使用 pyspark 作为解决方案。关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: pyspark one-hot-encoding


    【解决方案1】:

    如果您还不知道预期的分类值,您可以使用pyspark.sql.functions.udf 将其拆分并标记为一个值数组,并使用pyspark.sql.functions.explode 函数将它们转换为列。然后,您可以将值旋转到列:

    # required imports
    import pyspark.sql.functions as F
    from pyspark.sql.types import ArrayType, StringType
    import re
    
    # regex pattern to split 'tagged values'
    pat = re.compile('<(.*?)>')
    
    #udf to split string to array of values
    split_f = f.udf(lambda s: pat.split(s), ArrayType(StringType()))
    
    # sample data
    df = spark.createDataFrame([(0,'<a><b>','ex1'),(1,'<a><c>','ex2')], ['Id', '---Tags---', 'some_text'])
    
    +---+----------+---------+
    | Id|---Tags---|some_text|
    +---+----------+---------+
    |  0|    <a><b>|      ex1|
    |  1|    <a><c>|      ex2|
    +---+----------+---------+
    
    df.withColumn('exploded', 
       F.explode(split_f(F.col('---Tags---'))))
      .groupby('Id').pivot('exploded').count().na.fill(0).show()
    
    +---+---+---+---+
    | Id|  a|  b|  c|
    +---+---+---+---+
    |  0|  1|  1|  0|
    |  1|  1|  0|  1|
    +---+---+---+---+
    

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2018-01-11
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多