首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查用户是否在MovieLens dataframe中看过影片

检查用户是否在MovieLens dataframe中看过影片
EN

Stack Overflow用户
提问于 2021-08-23 12:12:45
回答 1查看 66关注 0票数 0

我正在尝试创建一个数据文件,其中每个用户都将有一个具有二进制分类的所有电影的列表,不管用户是否看过这部电影。RN我使用的是MovieLens small (ZIP),并试图获得如下结果:

代码语言:javascript
复制
   1  2  3  4  5  6  etc
1  0  0  1  1  0  1  etc
2  1  0  0  0  1  1  etc
3  0  1  1  0  0  1  etc

原始的DataFrames类似于:

代码语言:javascript
复制
    movieId  title 
0   1        Toy Story (1995)    
1   2        Jumanji (1995)
2   3        Grumpier Old Men (1995)    
3   4        Waiting to Exhale (1995)   
代码语言:javascript
复制
    userId  movieId     rating  timestamp
0   1       1           4.0     964982703
1   1       3           4.0     964981247
2   1       6           4.0     964982224
3   1       47          5.0     964983815
4   1       50          5.0     964982931

其中索引是用户ID,列是电影ID。我试着用这样的列表理解来解决这个问题:

代码语言:javascript
复制
pd.DataFrame(data=[[1 if movie_id in ratings_df[ratings_df["userId"] == user_id]["movieId"] else 0 for movie_id in tqdm(range(1, last_movie + 1))] for user_id in range(1, last_user + 1)], columns=movie_columns) 

但这条路太慢了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 12:32:57

使用pd.crosstab

对于本样本:

代码语言:javascript
复制
       userId  movieId  rating   timestamp
85255     554     1947     5.0   944900238
21229     140     1262     5.0   942841394
40791     275     2580     4.0  1049078929
73989     474     3135     4.0  1115125983
73989     474     3135     4.0  1115125983  # dupe
22434     153      520     2.0  1525552333
22434     153      520     2.0  1525552333  # dupe

您可以使用:

代码语言:javascript
复制
>>> pd.crosstab(df['userId'], df['movieId']).astype(bool).astype(int)

movieId  520   1262  1947  2580  3135
userId
140         0     1     0     0     0
153         1     0     0     0     0
275         0     0     0     1     0
474         0     0     0     0     1
554         0     0     1     0     0

仅用于整个小数据集的信息(100836行x4列)

代码语言:javascript
复制
# Solution proposed from duplicated link
>>> %timeit pd.get_dummies(df.set_index('userId')['movieId'])
9.73 s ± 158 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# Proposed solution here
>>> %timeit pd.crosstab(df['userId'], df['movieId']).astype(bool).astype(int)
5.95 s ± 307 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68892492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档