如何使一个整数索引对应于一个字符串值?
how to make an integer index corresponding to a string value?
我目前正在使用 Goodreads 数据构建推荐系统。
我想将字符串用户 ID 更改为整数。
当前用户id是这样的:'0d688fe079530ee1fe6fa85eab10ec5c'
我想将其更改为整数(例如 1
、2
、3
、...),以具有共享相同字符串 ID 的相同整数 ID。我考虑过使用函数 df.groupby('user_id')
,但我不知道该怎么做。
如果有人告诉我如何更改,我将不胜感激。
按照@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',
'58d3869488a648aebef32b6c2ec4fb16',
'db74d6df03644e61b4cd830db35de6a8'],
'book_id': [1942, 3116, 3558, 2467, 2318, 5882, 6318],
'ratings': [3, 5, 4, 3, 2, 4, 5]
})
我目前正在使用 Goodreads 数据构建推荐系统。
我想将字符串用户 ID 更改为整数。
当前用户id是这样的:'0d688fe079530ee1fe6fa85eab10ec5c'
我想将其更改为整数(例如 1
、2
、3
、...),以具有共享相同字符串 ID 的相同整数 ID。我考虑过使用函数 df.groupby('user_id')
,但我不知道该怎么做。
如果有人告诉我如何更改,我将不胜感激。
按照@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',
'58d3869488a648aebef32b6c2ec4fb16',
'db74d6df03644e61b4cd830db35de6a8'],
'book_id': [1942, 3116, 3558, 2467, 2318, 5882, 6318],
'ratings': [3, 5, 4, 3, 2, 4, 5]
})