基于两个DataFrame计算物品平均评分与用户评分一致性的方法咨询
问题1:生成包含物品平均评分与等级的DataFrame
假设你已有的用户评分表名为df_rating,物品属性表名为df_item,实现代码如下:
import pandas as pd # 计算每个物品的平均评分 item_avg = df_rating.groupby('item', as_index=False)['rating'].mean().rename(columns={'rating':'average_rating'}) # 关联物品等级字段,how参数可按需调整: # inner:仅保留两个表共有的物品;outer:保留两边所有物品,缺失值自动填充NaN result = pd.merge(item_avg, df_item[['item', 'grade']], on='item', how='inner')
运行后得到的result就是你需要的结构。
问题2:用户评分与物品标注等级一致性计算
你提到的用列表存储字段的方案完全可行,pandas支持object类型存储列表数据,具体实现步骤如下:
- 先将物品等级映射为数值(Good→1,Bad→0)
- 给每条用户评分记录关联上对应物品的数值等级
- 按用户分组,将评分和对应等级分别聚合为列表
- 计算两个列表对应值相等的比例,即为一致性得分
实现代码如下:
# 1. 生成等级的数值映射 df_item['grade_num'] = df_item['grade'].map({'Good': 1, 'Bad': 0}) # 2. 给评分表关联物品数值等级,inner会自动过滤掉没有等级标注的评分记录 df_combined = pd.merge(df_rating, df_item[['item', 'grade_num']], on='item', how='inner') # 3. 按用户分组聚合成列表 user_result = df_combined.groupby('user', as_index=False).agg( reviews_given = ('rating', list), item_grades = ('grade_num', list) ) # 4. 计算一致性得分 user_result['consistency'] = user_result.apply( lambda row: sum(a == b for a, b in zip(row['reviews_given'], row['item_grades'])) / len(row['reviews_given']), axis=1 )
如果需要保留没有等级标注的评分记录,可以将merge的how参数改为left,之后自行处理缺失的grade_num值即可。
内容的提问来源于stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

