我有一个数据框
> df = pd.DataFrame({"user_hash": ["b","a","c", "a"]})
> df
user_hash
0 b
1 a
2 c
3 a
其中user_hash
表示长哈希值,因此为了清楚起见,我想添加一列,该列仅按出现顺序枚举元素。在示例中,我想要的结果将是:
> df2
user_hash user_id
0 b 0
1 a 1
2 c 2
3 a 1
这个问题非常接近:Q: [Pandas] How to efficiently assign unique ID to individuals with multiple entries based on name in very large df,但是由于它依赖于groupby
,所以id的顺序是排序条目的自然顺序,而我希望id的顺序是出现的顺序。
答案 0 :(得分:3)
使用pd.factorize:
labels, _ = pd.factorize(df['user_hash'])
result = df.assign(user_id=labels)
print(result)
输出
user_hash user_id
0 b 0
1 a 1
2 c 2
3 a 1
或者替代使用ngroup:
result = df.assign(user_id=df.groupby('user_hash', sort=False).ngroup())
print(result)
输出
user_hash user_id
0 b 0
1 a 1
2 c 2
3 a 1
答案 1 :(得分:1)
您可以通过一条指令来完成它:
df = df.merge(pd.DataFrame(df.user_hash.unique(), columns=['user_hash'])
.reset_index(), how='left')
结果是:
user_hash index
0 b 0
1 a 1
2 c 2
3 a 1
如果需要,将第二列名称( index )更改为您选择的任何其他名称。