pyspark 中连续多个 1 的单热编码

One-hot encoding in pyspark with Multiple 1's in a row

我有一个 Python 数据框 final_df 如下:

这些行具有重复的 ID 值。如何使用 pyspark 获得如下的单热编码输出?

我已将其转换为 spark 数据框:

spark_df = sqlContext.createDataFrame(final_df)

然后在CONCEPTS列中收集唯一值如下:

types = spark_df.select("CONCEPTS").distinct().rdd.flatMap(lambda x: x).collect()

但是当我调用以下内容时:

types_expr = [F.when((F.col("CONCEPTS") == ty), 1).otherwise(0).alias(ty) for ty in types]
df = spark_df.select("ID", *types_expr)
df.show()

我得到以下信息:

与此类似的其他问题的解决方案不会为一行生成多个 1。

您可以使用 GroupedData class 的 pivot 函数,因为您只使用 1 和 0。示例代码:

l =[( 115        ,'A' ),
( 116        , 'B' ),
( 118        , 'C' ),
( 121        , 'D' ),
( 125        , 'E' ),
( 127        , 'F' ),
( 127        , 'G' ),
( 127        , 'H' ),
( 136        , 'I' ),
( 136        , 'J' )]

df = spark.createDataFrame(l, ['id','concepts'])
df.groupBy('id').pivot('concepts').count().show()

将导致以下数据框:

+---+----+----+----+----+----+----+----+----+----+----+   
| id|   A|   B|   C|   D|   E|   F|   G|   H|   I|   J| 
+---+----+----+----+----+----+----+----+----+----+----+ 
|136|null|null|null|null|null|null|null|null|   1|   1| 
|116|null|   1|null|null|null|null|null|null|null|null| 
|115|   1|null|null|null|null|null|null|null|null|null| 
|127|null|null|null|null|null|   1|   1|   1|null|null| 
|118|null|null|   1|null|null|null|null|null|null|null| 
|125|null|null|null|null|   1|null|null|null|null|null| 
|121|null|null|null|   1|null|null|null|null|null|null| 
+---+----+----+----+----+----+----+----+----+----+----+

如果需要,用 fill 函数替换空值。


评论中有人询问如何使用 pandas 完成此操作。它基本上是相同的方法,但所需的功能是 pivot_table.

import pandas as pd
import numpy as np

l =[( 115        ,'A' ),
( 116        , 'B' ),
( 118        , 'C' ),
( 121        , 'D' ),
( 125        , 'E' ),
( 127        , 'F' ),
( 127        , 'G' ),
( 127        , 'H' ),
( 136        , 'I' ),
( 136        , 'J' )]

df = pd.DataFrame(l,columns=['id','concepts'] )
df.pivot_table(index='id', columns='concepts', aggfunc=len)

输出:

concepts    A    B    C    D    E    F    G    H    I    J
id                                                        
115       1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
116       NaN  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
118       NaN  NaN  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
121       NaN  NaN  NaN  1.0  NaN  NaN  NaN  NaN  NaN  NaN
125       NaN  NaN  NaN  NaN  1.0  NaN  NaN  NaN  NaN  NaN
127       NaN  NaN  NaN  NaN  NaN  1.0  1.0  1.0  NaN  NaN
136       NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0