规范化ID列

时间:2017-05-25 15:11:20

标签: python pandas numpy ipython jupyter-notebook

我正在制作推荐系统,我想要一个评级矩阵(用户/项目)。
我的问题是数据集中只有9066个唯一项目,但是他们的ID范围从1到165201.
所以我需要一种方法来将ID映射到1到9066之间,而不是1到165201.
我该怎么做?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我会查看列表中id最小的项目,将其设置为1,然后找到下一个最小项目,将其设置为2,依此类推。

编辑:你是对的。这将花费太长时间。我会直接将其中一个设置为1,将下一个设置为2,依此类推。 ids所处的顺序并不重要(我猜)。添加新项目时,只需将其设置为9067,依此类推。