规范化 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 列的主要内容,如果未能解决你的问题,请参考以下文章

列 ID 在规范中出现多次

在 Pandas 数据框中使用 JSON 数据规范化列

规范化表:在一系列行中查找唯一列 (Oracle 10.x)

mysql数据库设计规范

CSV的规范与使用

mysql设计规范一