【问题标题】:creating a new dataframe based on a column storing index基于列存储索引创建新数据框
【发布时间】:2019-05-21 21:46:29
【问题描述】:

我正在努力在 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 中有没有办法做到这一点?

【问题讨论】:

    标签: pyspark apache-spark-sql


    【解决方案1】:

    您可以使用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| 
    +----------+----+----+----+----+----+----+
    

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 2018-02-14
      • 2020-05-25
      • 1970-01-01
      • 2020-10-11
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多