【问题标题】:Rearrange a pandas data frame to create a 2d ratings matrix重新排列 pandas 数据框以创建 2d 评级矩阵
【发布时间】:2016-10-01 06:57:17
【问题描述】:

我正在尝试根据 yelp 数据集构建基于项目的推荐系统。我设法将数据处理到一定程度,让所有在给定状态下评论餐厅的用户给出的评分。最终我想达到这样的程度,即我有一个评分矩阵,其中一个轴是餐厅,另一个轴是用户,中间是评分(1-5)(缺少评论为零)。

现在 DF 看起来像这样:

               user_id               review_id             business_id  stars
0  Xqd0DzHaiyRqVH3WRG7  15SdjuK7DmYqUAj6rjGowg  vcNAWiLM4dR7D2nwwJ7nCA      5
1  Xqd0DzHaiyRqVH3WRG7  15SdjuK7DmYqUAj6rjGowg  vcNAWiLM4dR7D2nwwJ7nCA      5
2  H1kH6QZV7Le4zqTRNxo  RF6UnRTtG7tWMcrO2GEoAg  vcNAWiLM4dR7D2nwwJ7nCA      2
3  zvJCcrpm2yOZrxKffwG  -TsVN230RCkLYKBeLsuz7A  vcNAWiLM4dR7D2nwwJ7nCA      4
4  KBLW4wJA_fwoWmMhiHR  dNocEAyUucjT371NNND41Q  vcNAWiLM4dR7D2nwwJ7nCA      4
5  zvJCcrpm2yOZrxKffwG  ebcN2aqmNUuYNoyvQErgnA  vcNAWiLM4dR7D2nwwJ7nCA      4
6  Qrs3EICADUKNFoUq2iH  _ePLBPrkrf4bhyiKWEn4Qg  vcNAWiLM4dR7D2nwwJ7nCA      1

但我希望它看起来更像这样:

(4 家餐厅 x 5 位用户)

0 4 3 4 5
3 3 3 2 1 
1 2 3 4 5
0 5 3 3 4 

【问题讨论】:

  • 如果您在此处包含一个可复制粘贴的示例会更好。你需要一个像支点这样的东西,但 yelp 数据集真的很稀疏,所以你可能会遇到内存问题。这种结构可能更合适。
  • 喜欢而不是图片的链接?我不知道怎么做,但我可以试试
  • 我认为最好的样本是带有df = pd.DataFrame({'A':['a','b','c','c'], 'B':['g','h','f', 'p'], 'C':[7,8,9,1]}) 等虚拟数据的样本,如果需要,请尝试修改。也不要忘记添加所需的输出。
  • 是的,只需复制并粘贴数据框的前几行,然后使用 {} 按钮将其格式化为代码。我编辑了具有相似值的帖子。
  • 谢谢阿汉!这看起来很棒,我认为对其他用户更有帮助。

标签: python pandas dataframe recommendation-engine yelp


【解决方案1】:

我认为你需要pivotfillna

print (df.pivot(index='business_id', columns='user_id', values='stars').fillna(0))

如果:

ValueError:索引包含重复条目,无法重塑

然后使用pivot_table:

print (df.pivot_table(index='business_id', columns='user_id', values='stars').fillna(0))
user_id                 H1kH6QZV7Le4zqTRNxo  KBLW4wJA_fwoWmMhiHR  \
business_id                                                        
vcNAWiLM4dR7D2nwwJ7nCA                    2                    4   

user_id                 Qrs3EICADUKNFoUq2iH  Xqd0DzHaiyRqVH3WRG7  \
business_id                                                        
vcNAWiLM4dR7D2nwwJ7nCA                    1                    5   

user_id                 zvJCcrpm2yOZrxKffwG  
business_id                                  
vcNAWiLM4dR7D2nwwJ7nCA                    4  

pivot_table 使用aggfunc,如果重复则默认为aggfunc=np.mean。更好的示例解释是heredocs

【讨论】:

  • 我试过这个,内核崩溃了。数据集肯定很大。我要把 head() 添加到最后,看看是否可行。
  • 或者尝试测试df_small = df.head(100)
  • 所以我认为这是我需要的,但它还没有完全实现......这不是第一个解决方案,因为它让我将评论作为 y 轴。相反,我希望将企业作为 y 轴。理论上第二个答案应该有效,但现在我收到一个错误消息:ValueError: Index contains duplicate entries, cannot reshape
  • 我认为问题是有多个用户在审查同一个业务,所以它不能将业务用作索引?但是我们如何解决这个问题,让多个用户只拥有一项业务呢?
  • 尽管有aggfunc=np.mean 免责声明,但数据透视表似乎运行良好,尽管它有点稀疏。我知道这是一个不同的问题,但我们如何删除评论少于 20 家餐厅的用户?
猜你喜欢
  • 2020-11-09
  • 2021-10-11
  • 2021-07-17
  • 2017-02-17
  • 2020-09-11
  • 2013-01-12
  • 2020-03-23
  • 2018-12-03
  • 2013-03-30
相关资源
最近更新 更多