python - 规范化 ID 列

标签 python pandas numpy ipython jupyter-notebook

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

相关文章:

python - 用 fabric 读取日志

python - 具有不同字符的字符串

python-3.x - 循环将多个列表附加到数据帧python中

python - 如何从两个列表创建 pandas 数据框,其中第一个列表的每个值将第二个列表的每个值作为记录

python - 向量和 pandas 列(线性向量)之间的余弦相似度

python - 确定 numpy 数组的字节顺序

Python pandas 按文本拆分列

pandas - 提取 DataFrameGroupBy 中具有最大值的行

python - 将唯一值加入新数据框(python、pandas)

python - 查找包含 'inf' 或 'nan' 的项目的索引