规范化 ID 列
Posted
技术标签:
【中文标题】规范化 ID 列【英文标题】:Normalize IDs column 【发布时间】:2017-10-26 07:20:36 【问题描述】:我正在制作一个推荐系统,我想要一个评分矩阵(用户/项目)。我的问题是数据集中只有 9066 个唯一项目,但它们的 ID 范围从 1到 165201。 所以我需要一种方法将 ID 映射到 1 到 9066 的范围内,而不是 1 到 165201。 我该怎么做?
【问题讨论】:
无法接听 ATM。查看 pandas.factorize @piRSquared 我无法使用它。我的数据集位于 pandas 数据框中,我无法将 itemID 列转换为从 1 到(唯一项目数)的范围。 【参考方案1】:考虑数据框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
【讨论】:
【参考方案2】:我会遍历并找到列表中 id 最小的项目,将其设置为 1,然后找到下一个最小的项目,将其设置为 2,依此类推。
编辑:你是对的。那需要的时间太长了。我只需将其中一个设置为 1,将下一个设置为 2,依此类推。 id 的顺序无关紧要(我猜)。添加新项目时,只需将其设置为 9067,依此类推。
【讨论】:
那会花费太多时间。此外,每当向数据集中添加新项目时,都需要再次运行整个过程。以上是关于规范化 ID 列的主要内容,如果未能解决你的问题,请参考以下文章