2017-05-25 52 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

這將花費太多時間。此外,無論何時將新項目添加到數據集,都需要再次運行整個過程。 –