生成用户/项目交互



我有一个熊猫数据帧(交互数据帧(,其中列为用户、项目、评级。

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

最新更新