第一篇文章,我尽力描述我的问题。如果我需要针对格式进行调整或澄清问题的任何方面,请告诉我。谢谢!
我有庞大的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
答案 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'应无意义。