【问题标题】:Pandas GroupBy column value and create list of fixed size from values in each groupPandas GroupBy 列值并根据每个组中的值创建固定大小的列表
【发布时间】:2018-05-01 21:25:19
【问题描述】:

第一篇文章,尽我所能描述我的问题。如果我需要在格式方面进行任何调整或澄清问题的任何方面,请告诉我。谢谢!

我有大型 Pandas 电影评分数据框,我需要为每部电影创建用户评分向量。我正在寻找一种更有效的方法(使用 pandas / numpy 操作或矢量化??),以便处理我的数据集中的 26M 行或用户、电影评分对。

电影评分的数据框如下所示: 输入:

movieId userId  rating
1            1     1.0
1            2     4.5
1            5     5.0
1            8     5.0
1           10     5.0
2            1     2.0
2            3     4.5
2            5     5.0
2            6     3.0
2            8     4.0

输出:

密钥 = 电影 ID

Value = 每个用户评分的密集数组,0 表示用户没有对电影评分。

{
   0:[1.0, 4.5, 0.0, 0.0, 5.0, 0.0, 0.0, 5.0, 0.0, 5.0]
   1:[2.0, 0.0, 4.5, 0.0, 5.0, 3.0, 0.0, 4.0, 0.0, 0.0]
}

我目前有这个功能可以正确执行工作,但没有缩放我需要处理的数据量。 user_rating_by_movie 是与输入形式匹配的全局 pandas 数据框。 num_users 是用作向量长度的最大用户 ID。

def build_rating_vector_for_movie(movie_id, num_users):   
    rating_vector = [0] * num_users
    movie_group = user_rating_by_movie.get_group(movie_id)

    for u, r in zip(movie_group.userId.values, movie_group.rating.values):
        rating_vector[u - 1] = r

    movie_user_ratings[movie_id] = rating_vector

【问题讨论】:

    标签: python pandas numpy optimization


    【解决方案1】:

    灵感来自@Wen

    pd.crosstab(df.movieId, df.userId, df.rating, aggfunc='mean').fillna(0).T.to_dict('list')
    

    输出:

    {1: [1.0, 4.5, 0.0, 5.0, 0.0, 5.0, 5.0],
     2: [2.0, 0.0, 4.5, 5.0, 3.0, 4.0, 0.0]}
    
    • 注意:

      如果每个用户对每部电影进行评分,那么 aggfunc 中的“平均值”应该是没有意义的。

    【讨论】:

    • 使用 Jupiter %timeit 魔术命令比较运行时间:Wen 的解决方案:1 个循环,最好的 3 个:每个循环 6.13 秒。 Scott Boston 的解决方案:1 个循环,最好的 3 个:每个循环 902 毫秒。感谢您的帮助。
    【解决方案2】:

    通过使用pivot+reindex

    df.pivot('movieId','userId',values='rating').reindex(columns=list(range(1,11))).fillna(0)
    Out[219]: 
    userId    1    2    3    4    5    6    7    8    9    10
    movieId                                                  
    1        1.0  4.5  0.0  0.0  5.0  0.0  0.0  5.0  0.0  5.0
    2        2.0  0.0  4.5  0.0  5.0  3.0  0.0  4.0  0.0  0.0
    

    要构建字典,请在末尾添加.T.to_dict('list')

    df.pivot('movieId','userId',values='rating').reindex(columns=list(range(1,11))).fillna(0).T.to_dict('list')
    Out[223]: 
    {1: [1.0, 4.5, 0.0, 0.0, 5.0, 0.0, 0.0, 5.0, 0.0, 5.0],
     2: [2.0, 0.0, 4.5, 0.0, 5.0, 3.0, 0.0, 4.0, 0.0, 0.0]}
    

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多