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

10-11 10:21
查看更多