我正在使用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中有做吗?
答案 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|
+----------+----+----+----+----+----+----+