函数未返回指定数量观测值:获取用户Top N高评分电影异常问题
解决办法:修正评分筛选逻辑
我来帮你排查下代码里的问题——你的逻辑卡在了分组和数据筛选的顺序上,导致head(n_rows)没有按你预期的方式工作:
你的代码里的核心问题
- 冗余的数据集操作:
data_.loc[user.index]和你已经筛选好的user变量完全一致,这一步是多余的。 groupby后head()的逻辑错误:当你对电影标题分组后调用head(n_rows),它会给每个电影分组都取前n_rows行,而不是从用户的所有评分里挑出前n_rows个高分项,这就是为什么你会得到用户所有评分电影的原因。- 排序时机错误:你先取了部分数据再排序,这会导致结果不是按评分从高到低的优先级筛选的。
针对需求的两种修正方案
根据你的需求(展示用户评分最高的n部电影),分两种场景给出解决方案:
场景1:用户可能对同一部电影多次评分,需要展示每部电影的最高评分,再取前n部
如果用户给同一部电影打过分次,你想先保留每部电影的最高评分,再挑出评分最高的前n部:
def top_movies(data_, usr, n_rows = 10): # 第一步:筛选出该用户的所有评分记录 user_ratings = data_[data_['user_id'] == usr] # 第二步:按电影分组,提取每部电影的最高评分,重置索引变回DataFrame movie_top_ratings = user_ratings.groupby('title')['rating'].max().reset_index() # 第三步:按评分降序排序,取前n_rows条结果 final = movie_top_ratings.sort_values(by='rating', ascending=False).head(n_rows) return final def ex9(): return top_movies(data, 1, 30) ex9()
场景2:不需要去重,直接取用户所有评分记录里评分最高的前n条
如果允许同一部电影多次出现在结果里(比如用户给某部电影打了多次高分,都想展示),可以简化逻辑:
def top_movies(data_, usr, n_rows = 10): # 筛选用户评分后直接按评分降序排序,取前n_rows条 user_ratings = data_[data_['user_id'] == usr] final = user_ratings.sort_values(by='rating', ascending=False).head(n_rows) return final def ex9(): return top_movies(data, 1, 30) ex9()
这两种方案都能精准返回你预期的前30行最高评分数据,你可以根据实际的业务需求选择对应的版本。
内容的提问来源于stack exchange,提问作者programmerA
相关产品推荐
相关产品推荐

