Pandas GroupBy列值并从每个组中的值创建固定大小的列表

时间:2017-11-18 02:27:37

标签: python pandas numpy optimization

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

我有庞大的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

输出:

Key = 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是与输入形式匹配的全局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

2 个答案:

答案 0 :(得分:1)

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

对于构建,dict在末尾添加.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]}

答案 1 :(得分: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]}
  • 注意:

    如果每部电影的每位用户评分为1分,则aggfunc中的'mean'应无意义。