我有一个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。
答案 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函数替换空值