Python 按列值分组,并根据每个组中的值创建固定大小的列表

Python 按列值分组,并根据每个组中的值创建固定大小的列表,python,pandas,numpy,optimization,Python,Pandas,Numpy,Optimization,第一篇文章,我尽了最大努力描述我的问题。如果我需要调整格式或澄清问题的任何方面,请告诉我。谢谢 我有电影评级的大熊猫数据框架,我需要为每部电影创建用户评级向量。我正在寻找一种更有效的方法(使用pandas/numpy操作或矢量化??)来处理我数据集中的2600万行或用户、电影分级对 电影收视率的数据框如下所示: 输入: 输出: 密钥=电影ID Value=每个用户的密集分级数组,0表示用户未对电影进行分级 { 0:[1.0, 4.5, 0.0, 0.0, 5.0, 0.0, 0.0, 5.

第一篇文章,我尽了最大努力描述我的问题。如果我需要调整格式或澄清问题的任何方面,请告诉我。谢谢

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

电影收视率的数据框如下所示: 输入:

输出:

密钥=电影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\u rating\u by\u 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

通过使用
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]}
受到@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 magic命令比较运行时间:Wen的解决方案:1个循环,每个循环最好3:6.13秒。Scott Boston的解决方案:1个环路,每个环路3:902毫秒的最佳值。谢谢你的帮助。
{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]}