我正在制作推荐系统,我想要一个评级矩阵(用户/项目)。
我的问题是数据集中只有9066个唯一项目,但是他们的ID范围从1到165201.
所以我需要一种方法来将ID映射到1到9066之间,而不是1到165201.
我该怎么做?
答案 0 :(得分:4)
考虑数据框df
np.random.seed([3,1415])
df = pd.DataFrame(dict(
User=np.random.randint(10, size=20),
Item=np.random.randint(100, size=20)
))
print(df)
Item User
0 27 0
1 77 2
2 54 7
3 39 3
4 23 8
5 84 7
6 37 0
7 99 6
8 87 8
9 37 6
10 63 0
11 25 2
12 11 0
13 71 4
14 44 9
15 70 7
16 4 3
17 71 2
18 63 4
19 86 3
使用unique
获取唯一值并构建映射字典
u = df.Item.unique()
m = dict(zip(u, range(len(u))))
然后使用map
生成重新配置的列
df.assign(Item=df.Item.map(m))
Item User
0 0 0
1 1 2
2 2 7
3 3 3
4 4 8
5 5 7
6 6 0
7 7 6
8 8 8
9 6 6
10 9 0
11 10 2
12 11 0
13 12 4
14 13 9
15 14 7
16 15 3
17 12 2
18 9 4
19 16 3
或者我们可以用pd.factorize
df.assign(Item=pd.factorize(df.Item)[0])
Item User
0 0 0
1 1 2
2 2 7
3 3 3
4 4 8
5 5 7
6 6 0
7 7 6
8 8 8
9 6 6
10 9 0
11 10 2
12 11 0
13 12 4
14 13 9
15 14 7
16 15 3
17 12 2
18 9 4
19 16 3
答案 1 :(得分:0)
我会查看列表中id最小的项目,将其设置为1,然后找到下一个最小项目,将其设置为2,依此类推。
编辑:你是对的。这将花费太长时间。我会直接将其中一个设置为1,将下一个设置为2,依此类推。 ids所处的顺序并不重要(我猜)。添加新项目时,只需将其设置为9067,依此类推。