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魔命令运行时间
答
通过使用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]}
比较 1循环,最好的3:每次循环6.13秒。 斯科特波士顿的解决方案: 1循环,最好每循环3:902毫秒。 感谢您的帮助。 – cgels