规范化ID列

2024-03-28 19:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个推荐系统,我想有一个评分矩阵(用户/项目)。
我的问题是数据集中只有9066个唯一的项目,但它们的ID范围是1到165201。
所以我需要一种方法将ID映射到1到9066,而不是1到165201。
我该怎么做?你知道吗


Tags: 数据项目方法用户id系统矩阵评分
2条回答

我将遍历并找到列表中id最小的项,将其设置为1,然后找到下一个最小的项,将其设置为2,依此类推。你知道吗

编辑:你说得对。那要花很长时间。我只需要通过设置其中一个为1,下一个为2,依此类推。不管身份证的顺序是什么(我猜)。添加新项目时,只需将其设置为9067,以此类推。你知道吗

考虑数据帧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

相关问题 更多 >