熊猫-根据行值生成唯一ID

时间:2020-02-25 11:33:08

标签: python pandas hash

我想为用户生成一个基于整数的唯一ID(在我的df中)。

假设我有:

index  first  last    dob
0      peter  jones   20000101
1      john   doe     19870105
2      adam   smith   19441212
3      john   doe     19870105
4      jenny  fast    19640822

我想生成一个ID列,如下所示:

index  first  last    dob       id
0      peter  jones   20000101  1244821450
1      john   doe     19870105  1742118427
2      adam   smith   19441212  1841181386
3      john   doe     19870105  1742118427
4      jenny  fast    19640822  1687411973

10位ID,但这是基于字段的值的(john doe相同的行值将获得相同的ID)。

我已经研究了散列,加密和UUID,但找不到与此特定的非安全用例有很多关系。只是要生成一个内部标识符。

  • 在以下情况下,我不能使用groupby / cat代码类型的方法: 行更改。
  • 数据集不会超过5万行。
  • 可以放心地假设不会重复第一个,最后一个dob。

感觉好像我可能以错误的方式来解决这个问题,因为我找不到很多文献!

谢谢

3 个答案:

答案 0 :(得分:1)

这是使用numpy的一种方式

import numpy as np
np.random.seed(1)

# create a list of unique names
names = df[['first', 'last']].agg(' '.join, 1).unique().tolist()

# generte ids
ids = np.random.randint(low=1e9, high=1e10, size = len(names))

# maps ids to names
maps = {k:v for k,v in zip(names, ids)}

# add new id column
df['id'] = df[['first', 'last']].agg(' '.join, 1).map(maps)

   index  first   last       dob          id
0      0  peter  jones  20000101  9176146523
1      1   john    doe  19870105  8292931172
2      2   adam  smith  19441212  4108641136
3      3   john    doe  19870105  8292931172
4      4  jenny   fast  19640822  6385979058

答案 1 :(得分:1)

您可以尝试使用哈希函数。

df['id'] = df[['first', 'last']].sum(axis=1).map(hash)

请注意,哈希ID大于10位,并且是唯一的整数序列。

答案 2 :(得分:0)

您可以在数据框列上应用以下功能。

def generate_id(s):
    return abs(hash(s)) % (10 ** 10)

df['id'] = df['first'].apply(generate_id)

如果发现某些值的位数不正确,可以执行以下操作-

def generate_id(s, size):
    val = str(abs(hash(s)) % (10 ** size))
    if len(val) < size:
        diff = size - len(val)
        val = str(val) + str(generate_id(s[:diff], diff))
    return int(val)