基于存储索引的列创建一个新的数据框

时间:2019-05-20 21:09:43

标签: pyspark apache-spark-sql

我正在使用pyspark上的ALS进行协作过滤。这些模型在如下数据框中给出预测结果。

CustomerID    ProductID    Rating
    0             4          4.2
    0             2          2.7
    0             6           3
    1             7          2.3
    1             0          0.5
    2             3          3.1

我想将数据框转换为用户到项目矩阵,如下所示,其中productID变为列,每一行代表一个用户对所有产品的评价。

0    0    2.7  0    4.2  0    3    0
0.5  0    0    0    0    0    0    2.3
0    0    0    3.1  0    0    0    0

因此,对于此数据帧R,R [0,2] = 2.7表示用户0给产品2评分2.7。R[2,3] = 3.1表示用户2给产品3评分3.1。

在pyspark中有做吗?

1 个答案:

答案 0 :(得分:0)

您可以使用pivot函数和聚合函数来实现。我决定使用max,但根据您的数据,可以使用其他功能,例如avg

from pyspark.sql.functions import max

l = [( 0,             4.0 ,         4.2),
    (0,             2.0,         2.7),
    (0,             6.0,           3.0),
    (1,             7.0,          2.3),
    (1,             0.0,          0.5),
    (2,             3.0,          3.1)]

columns = ['CustomerID',    'ProductID',    'Rating']

df=spark.createDataFrame(l, columns)
df = df.groupby('CustomerID').pivot('ProductID').agg(max("Rating"))
df.show()

输出:

+----------+----+----+----+----+----+----+ 
|CustomerID| 0.0| 2.0| 3.0| 4.0| 6.0| 7.0| 
+----------+----+----+----+----+----+----+ 
|         0|null| 2.7|null| 4.2| 3.0|null| 
|         1| 0.5|null|null|null|null| 2.3| 
|         2|null|null| 3.1|null|null|null| 
+----------+----+----+----+----+----+----+