2017-05-25 29 views
2

我正在制作一个推荐系统,我想要一个评分矩阵(用户/项目)。
我的问题是数据集中只有9066个唯一项目,但它们的ID范围从1到165201.
因此,我需要一种方法将ID映射到1到9066的范围内,而不是1到165201.
我怎么做?Normalize IDs列

+0

已完成同样的事情无法应答ATM。看看pandas.factorize – piRSquared

+0

@piRSquared我无法使用它。我的数据集位于熊猫数据框中,无法将itemID列转换为范围从1到(唯一项目数)。 –

回答

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 
0

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

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

+0

这将花费太多时间。此外,无论何时将新项目添加到数据集,都需要再次运行整个过程。 –