2017-11-18 234 views
1

第一篇文章,盡我所能描述我的問題。讓我知道是否需要根據格式調整任何內容或澄清問題的任何方面。謝謝!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 

回答

1

通過@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

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 

對於構建的字典末

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]} 
相關問題