我正在製作一個推薦系統,我想要一個評分矩陣(用戶/項目)。
我的問題是數據集中只有9066個唯一項目,但它們的ID範圍從1到165201.
因此,我需要一種方法將ID映射到1到9066的範圍內,而不是1到165201.
我怎麼做?Normalize IDs列
2
A
回答
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
這將花費太多時間。此外,無論何時將新項目添加到數據集,都需要再次運行整個過程。 –
相關問題
- 1. Vector3.normalize();
- 2. Normalize MySQL fulltext score
- 3. boost :: filesystem normalize filename
- 4. Naudio聲音normalize
- 5. Microsoft.DirectX.Vector3.Normalize()不一致
- 6. normalize-space(。)和normalize-space(text())之間的區別是什麼?
- 7. 轉換列表到IDS
- 8. PHP取代IDS在陣列
- 9. ffmpeg-normalize pip安裝失敗
- 10. Ruby on Rails - Normalize-rails gem
- 11. HTML DOMs,ids vs no ids?
- 12. 讓IDS
- 13. 與IDS
- 14. 與IDS
- 15. mysql的where列= ID VS其中(IDS)
- 16. 列出頁面中的Ids內循環?
- 17. MySQL的IDS通過適當的系列
- 18. Opengl - 爲什麼normalize()不是冪等的?
- 19. 使用python Normalize人臉標誌數據
- 20. Numpy normalize multi dim(> = 3)數組
- 21. 分組IDS
- 22. ASP.NET List Item IDs
- 23. 提取IDS
- 24. Elementary Apex Object IDs
- 25. TFS 2010:IDS
- 26. 多HREF IDS
- 27. un_directed IDS數據幀
- 28. Ids的URL加密
- 29. 是JPA IDS順序
- 30. MySQL SELECT Tree Parent IDs
已完成同樣的事情無法應答ATM。看看pandas.factorize – piRSquared
@piRSquared我無法使用它。我的數據集位於熊貓數據框中,無法將itemID列轉換爲範圍從1到(唯一項目數)。 –