我正在制作一个推荐系统,我想要一个评分矩阵(用户/项目)。
我的问题是数据集中只有 9066 个唯一项目,但它们的 ID 范围为1 到 165201。
因此,我需要一种方法将 ID 映射到 1 到 9066 范围内,而不是 1 到 165201。
我该怎么做?
最佳答案
考虑数据帧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
关于python - 规范化 ID 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44183927/