Pandas GroupBy列值,并根据每组中的值创建固定大小的列表

Pandas GroupBy列值,并根据每组中的值创建固定大小的列表

问题描述:

第一篇文章,尽我所能描述我的问题。让我知道是否需要根据格式调整任何内容或澄清问题的任何方面。谢谢!Pandas GroupBy列值,并根据每组中的值创建固定大小的列表

我有大熊猫电影评级的数据框,我需要为每部电影创建用户评分向量。我正在寻找更高效的方法(使用熊猫/ 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 

输出:

答案= MovieID

值=密集为每个用户收视的阵列,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是一个匹配输入形式的全球熊猫数据框。 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 

通过@Wen

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

输出启发添加.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应该是毫无意义的,如果每个用户一个等级每部电影。 温氏溶液:

    的使用木星%timeit魔命令运行时间
+0

比较 1循环,最好的3:每次循环6.13秒。 斯科特波士顿的解决方案: 1循环,最好每循环3:902毫秒。 感谢您的帮助。 – cgels

通过使用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 

对于构建的字典末

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]}