pyspark中的一键编码,其中连续有多个1

时间:2018-11-01 19:13:46

标签: python pyspark one-hot-encoding

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

enter image description here

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

enter image description here

我已将其转换为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()

我得到以下信息:

enter image description here

其他类似问题的解决方案不会连续产生多个1。

1 个答案:

答案 0 :(得分:2)

由于只能使用1和0,因此可以使用GroupedData类的pivot函数。示例代码:

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函数替换空值