聚合pyspark中的一个热编码特征

聚合pyspark中的一个热编码特征,pyspark,Pyspark,我对python很有经验,但对pyspark完全陌生。我有一个dataframe,它包含大约50万行,具有几个分类特性。对于每个功能,我都有一个热编码功能。下面是一个简化但具有代表性的代码示例 从pyspark.ml.feature导入StringIndexer,OneHotEncoder 从pyspark.ml导入管道 df = sc.parallelize([ (1, 'grocery'), (1, 'drinks'), (1, 'bakery'),

我对python很有经验,但对pyspark完全陌生。我有一个dataframe,它包含大约50万行,具有几个分类特性。对于每个功能,我都有一个热编码功能。下面是一个简化但具有代表性的代码示例

从pyspark.ml.feature导入StringIndexer,OneHotEncoder 从pyspark.ml导入管道

df = sc.parallelize([
     (1, 'grocery'),
     (1, 'drinks'),
     (1, 'bakery'),
     (2, 'grocery'),
     (3, 'bakery'),
     (3, 'bakery'),
 ]).toDF(["id", "category"])

indexer = StringIndexer(inputCol='category', outputCol='categoryIndex')
encoder = OneHotEncoder(inputCol='categoryIndex', outputCol='categoryVec')

pipe = Pipeline(stages = [indexer, encoder])

newDF = pipe.fit(df).transform(df)
输出

+---+--------+-------------+-------------+
| id|category|categoryIndex|  categoryVec|
+---+--------+-------------+-------------+
|  1| grocery|          1.0|(2,[1],[1.0])|
|  1|  drinks|          2.0|    (2,[],[])|
|  1|  bakery|          0.0|(2,[0],[1.0])|
|  2| grocery|          1.0|(2,[1],[1.0])|
|  3|  bakery|          0.0|(2,[0],[1.0])|
|  3|  bakery|          0.0|(2,[0],[1.0])|
+---+--------+-------------+-------------+
现在,我想按“id”分组,并用sum聚合“categoryVec”列,这样我可以得到每个id的一行,并用一个向量指示客户购物的类别(可能有几个)。在pandas中,这只是将sum/mean应用于在
pd.get_dummies()
步骤中生成的每个列的情况,但在这里它似乎并不那么简单

然后,我将把输出传递给ML算法,因此我需要能够在输出上使用VectorAssembler或类似工具

哦,我真的需要一个pyspark解决方案


非常感谢你的帮助

您可以为此使用ConventVectorizer。它将类别索引数组转换为编码向量

from pyspark.ml.feature import CountVectorizer
from pyspark.ml import Pipeline
from pyspark.sql.window import Window
from pyspark.sql import functions as F


df = sc.parallelize([
     (1, 'grocery'),
     (1, 'drinks'),
     (1, 'bakery'),
     (2, 'grocery'),
     (3, 'bakery'),
     (3, 'bakery'),
 ]).toDF(["id", "category"]) \
   .groupBy('id') \
   .agg(F.collect_list('category').alias('categoryIndexes'))

cv = CountVectorizer(inputCol='categoryIndexes', outputCol='categoryVec')

transformed_df = cv.fit(df).transform(df)
transformed_df.show()
结果:

+---+--------------------+--------------------+
| id|     categoryIndexes|         categoryVec|
+---+--------------------+--------------------+
|  1|[grocery, drinks,...|(3,[0,1,2],[1.0,1...|
|  3|    [bakery, bakery]|       (3,[0],[2.0])|
|  2|           [grocery]|       (3,[1],[1.0])|
+---+--------------------+--------------------+

样本输入please@Suresh我希望我在编辑器中添加了一些有用的代码非常酷,谢谢!我想我需要为每个分类特征创建一个新的计数向量器?我已经这样做了,而且很有效,但并没有捷径,是吗?你们可以使用FeatureAssembler来连接不同的功能。但是,您应该检查不同类别中是否没有相同的类别特征值。