我有一个数据框,其中包含两列UserId和movieId。不同的用户观看了不同的电影。我想获取(例如,两个普通用户之间的三部普通电影)。
df = DataFrame({'userId' : [1,2,3,1,3,6,2,4,1,2], 'movieId' : [222,222,900,555,555,888,555,222,666,666]})
所需的结果应该是这样的
userId movieId
1 222
1 555
1 666
2 222
2 555
2 666
我不需要用户不包含三部普通电影的其他条目。例如,如果有另一个用户观看了所有三部电影,则应考虑。
这是做一些数据帧操作的代码。
设置一些变量:
n_common_movies = 3 n_users = 2
创建包含电影组的列:
df1 = df.groupby('userId')['movieId'].apply(list).reset_index(name='movies')
输出:
df1
userId movies
0 1 [222, 555, 666]
1 2 [222, 555, 666]
2 3 [900, 555]
3 4 [222]
4 6 [888]
将列表减少为相等的电影数量,n_common_movies
因为这是我们想要的总数。如果不满足,那么我们可以跳过其余过程。
df2 = df1.loc[df1['movies'].apply(lambda x: len(x))== n_common_movies,:]
输出:
df2
userId movies
0 1 [222, 555, 666]
1 2 [222, 555, 666]
使用pd.explode()“堆叠”步骤2的结果:
df3 = df2.explode('movies')
输出:
df3
userId movies
0 1 222
0 1 555
0 1 666
1 2 222
1 2 555
1 2 666
创建另一个分组以获取每个电影的观看次数:
df4 = df3.groupby('movies').size().reset_index(name='viewer_count')
输出:
df4
movies viewer_count
0 222 2
1 555 2
2 666 2
最后,检查以确保基于预期用户数的过滤结果等于普通电影数量的长度,并打印... userId,我猜是这样。打印任何您想要的,大声笑。
if len(df4[df4['viewer_count'] == n_users]) == n_common: tmp = '\n\t'.join([str(i) for i in list(set(df3['userId']))]) print('Users with three common movies: \n\t{}'.format(tmp))
输出:
Users with three common movies: 1 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句