按出现顺序分配索引

时间:2019-10-31 16:53:18

标签: python pandas

我有一个数据框

> 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的顺序是出现的顺序。

2 个答案:

答案 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 )更改为您选择的任何其他名称。