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
我有一个 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