python - 生成用户/项目交互
问题描述
我有一个熊猫数据框(交互数据框),其中包含用户、项目、评级等列。
Ratings ItemID UserID
1 1172952 A74
1 1178735 176
4 341785 70C
3 136771 67E
2 1178883 383
假设我还有两个数据框,分别有 200 个用户和 1000 个 ietms。问题是在交互数据框中,我需要对每个用户和每个项目组合进行评分。如果交互数据框中的用户和项目没有可用的交互,则用户/项目组合的评分为 0。
我试过使用这样的循环:
item_ids = np.repeat(item_data.id.values, len(user_data.id.values))
user_ids = np.tile(user_data.id.values, len(item_data.id.values))
ratings = np.empty([len(item_ids)])
for i in range(len(ratings)):
inter = interactions.loc[(interactions['UserID'] == user_ids[i]) & (interactions["ItemID"] == item_ids[i]), "Ratings"]
if not inter.empty:
ratings[i] = inter.values[0]
else:
ratings[i] = 0
interactions = np.stack((ratings, item_ids, user_ids), axis=-1)
但是对于只有 30,000 行的评级数组,需要 40 秒才能完成。有没有一种快速的方法来做到这一点?感谢帮助。
解决方案
你对问题的解释有点草率,但我感觉你需要这个:
interactions.set_index(['ItemID','UserID'])\
.unstack().fillna(0).astype(int).stack()\
.reset_index()
这段代码创建了一个用户和项目的矩形表格,用零填充空白,并将表格转换回“高”向量。输出:
ItemID UserID Ratings
0 136771 176 0
1 136771 383 0
2 136771 67E 3
3 136771 70C 0
4 136771 A74 0
5 341785 176 0
6 341785 383 0
7 341785 67E 0
8 341785 70C 4
9 341785 A74 0
10 1172952 176 0
....
我假设每个项目和每个用户(但不是他们的组合!)在interaction
表中至少被引用一次。如果没有,merge
则需要与其他两个表进行一些操作。
推荐阅读
- ruby - Emacs + Ruby:导航到@see YARD/RDoc 类/方法标记参考
- python - Python 通用多进程(无子进程)
- python - Python pandas 重新采样到不细分为 24 小时周期的周期
- swiftui - 如何从 Xcode UI 测试中查询包装在 UIViewRepresentable 中的 UITextField?
- sanity - 在 Sanity 网站上预览内容不起作用
- excel - VBA:如何在同一张纸上显示两个组合框
- c# - SqliteConnection,同一事务的多次提交不起作用
- c++ - 如何控制从 Bazel 中的共享库导出的符号?
- c++ - 函数返回类型重载 C++
- python - 没有换行符的python 3输入