我正在做一个推荐系统,我想有一个评分矩阵(用户/项目)。我的问题是数据集中只有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/