问题描述
我目前正在使用 Goodreads 数据构建推荐系统。
我想将字符串用户 ID 更改为整数。
当前用户 ID 如下所示:true
我想将其更改为整数(例如 '0d688fe079530ee1fe6fa85eab10ec5c'
、1
、2
、...),以具有共享相同字符串 ID 的相同整数 ID。我曾考虑使用函数 3
,但我不知道如何执行此操作。
如果有人告诉我如何改变,我将不胜感激。
解决方法
按照@AsishM 的建议使用 pd.factorize
。
输入数据:
user_id book_id ratings
0 831a1e2505e44a2f81e670db82c9a3c0 1942 3
1 58d3869488a648aebef32b6c2ec4fb16 3116 5
2 f05ad4c0978c4d0eb3ca41921f7a80af 3558 4
3 511c8f47d75c427eae8bead7ff80307b 2467 3
4 db74d6df03644e61b4cd830db35de6a8 2318 2
5 58d3869488a648aebef32b6c2ec4fb16 5882 4
6 db74d6df03644e61b4cd830db35de6a8 6318 5
df['uid'] = pd.factorize(df['user_id'])[0]
输出结果:
user_id book_id ratings uid
0 831a1e2505e44a2f81e670db82c9a3c0 1942 3 0
1 58d3869488a648aebef32b6c2ec4fb16 3116 5 1 # user 1
2 f05ad4c0978c4d0eb3ca41921f7a80af 3558 4 2
3 511c8f47d75c427eae8bead7ff80307b 2467 3 3
4 db74d6df03644e61b4cd830db35de6a8 2318 2 4 # user 4
5 58d3869488a648aebef32b6c2ec4fb16 5882 4 1 # user 1
6 db74d6df03644e61b4cd830db35de6a8 6318 5 4 # user 4
,
groupby
选项为 groupby ngroup
:
df['uid'] = df.groupby('user_id',sort=False).ngroup()
user_id book_id ratings uid
0 831a1e2505e44a2f81e670db82c9a3c0 1942 3 0
1 58d3869488a648aebef32b6c2ec4fb16 3116 5 1
2 f05ad4c0978c4d0eb3ca41921f7a80af 3558 4 2
3 511c8f47d75c427eae8bead7ff80307b 2467 3 3
4 db74d6df03644e61b4cd830db35de6a8 2318 2 4
5 58d3869488a648aebef32b6c2ec4fb16 5882 4 1
6 db74d6df03644e61b4cd830db35de6a8 6318 5 4
*sort=False
所以 user_id
按照它们在 DataFrame 中出现的顺序分组。
数据帧:
import pandas as pd
df = pd.DataFrame({
'user_id': ['831a1e2505e44a2f81e670db82c9a3c0','58d3869488a648aebef32b6c2ec4fb16','f05ad4c0978c4d0eb3ca41921f7a80af','511c8f47d75c427eae8bead7ff80307b','db74d6df03644e61b4cd830db35de6a8','db74d6df03644e61b4cd830db35de6a8'],'book_id': [1942,3116,3558,2467,2318,5882,6318],'ratings': [3,5,4,3,2,5]
})