Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-基于行值生成唯一ID_Python_Pandas_Hash - Fatal编程技术网

Python 熊猫-基于行值生成唯一ID

Python 熊猫-基于行值生成唯一ID,python,pandas,hash,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

我想为用户生成一个基于整数的唯一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代码类型方法,以防 行变了
  • 数据集不会超过50k行
  • 可以安全地假设不会有第一个、最后一个dob重复
我觉得我可能是用错误的方式处理这个问题,因为我找不到太多关于它的文献


谢谢

这里有一种使用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

您可以在数据框列上应用以下函数

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)
def生成_id(s,大小):
val=str(abs(散列))%(10**size))
如果len(val)<尺寸:
差异=尺寸-长度(val)
val=str(val)+str(生成_id(s[:diff],diff))
返回整数(val)

您可以尝试使用哈希函数

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

请注意,哈希id大于10位,是一个唯一的整数序列。

执行如下操作:
df.groupby(['first',last',dob'],sort=False)。ngroup().apply('{:010}'。格式)
做你想做的吗?你可以通过这个线程了解更多关于散列的知识。这很不错,虽然我得到了一些9位ID的混合印加,但你在生成9位数字的地方共享了两个字符串?
Sarah Wood
Tom Almond
我在多个环境中进行了测试,它只生成10位数字。检查此链接-@swifty添加一些代码,您可以使用、测试、修改相同的代码。是否需要使用
seed
使生成一致?