如何为熊猫数据框添加唯一的字母数字 ID?

Posted

技术标签:

【中文标题】如何为熊猫数据框添加唯一的字母数字 ID?【英文标题】:How to add unique alphanumeric id for pandas dataframe? 【发布时间】:2021-11-28 07:31:15 【问题描述】:

我需要一个可以为我的数据框生成唯一字母数字 id 列的解决方案。即使我以后运行脚本,我也需要保持相同的 ID。

    Name
    Sam
    Pray
    Brad

我可以根据 post 生成 ID,但我需要 5 位数字的 aplhanumeric 值,它们将始终保持不变。

这是所需的输出:

    Name         ID
    Sam          X25TR
    Peter        WE558
    Pepe         TR589

【问题讨论】:

【参考方案1】:

一种方法是通过任何散列算法生成名称的散列,并保留散列的前五个字符。但是您应该记住,如果您有足够的数据,那么使用短哈希可能会导致冲突(多个不同输入的相同输出)。

类似的东西:

import hashlib

def get_id(name: str) -> str:
    hash = hashlib.md5(name.encode())
    return hash.hexdigest()[:5]

现在对于给定的输入字符串,get_id 返回一个字母数字 5 字符的字符串,对于相同的输入,该字符串始终相同。

【讨论】:

旁注:如果输出可能区分大小写,如果您获取 md5 哈希的前 8 个字符并将它们从十六进制(base 16 [0-9a-f])转换,则冲突会更少到基数 62 [0-9a-zA-Z],其中 ffffffff (16) 等于 4GFfc3 (62) 对不起,4GFfc3 显然是 6 个字符。因此,制作 7 个 md5 字符:fffffff (16) = iakk7 (62)【参考方案2】:

此函数生成具有给定长度的随机字母数字字符串:

import math
import secrets


def random_alphanum(length: int) -> str:
        text = secrets.token_hex(nbytes=math.ceil(length / 2))
        isEven = length % 2 == 0
        return text if isEven else text[1:]

df['ID'] == random_alphanum(5)

应用于整行:

df2['ID'] = df2.apply(lambda x: random_alphanum(5), axis=1, result_type="expand")

【讨论】:

OP 说他想要一个始终相同的唯一数字,而不是随机数字,所以我猜他说的是哈希。 你测试了吗? @jezrael - yas,已编辑 - 需要添加带有 reseult_type="expand" 的 .apply - 每行都有唯一记录。 @PiotrŻak 你确定吗? OP 不需要每行的唯一值。 你能看看输出吗? - 每个名称有 3 个不同的值。【参考方案3】:

这是我的尝试

import secrets

 ids = []
 while len(ids) < df.shape[0]:
     temp = secrets.token_hex(5)[:5]
     if temp not in ids:
         ids.append(temp)
         

df.merge(pd.DataFrame(ids).reset_index(), left_on = df.groupby(['Name']).ngroup(), right_on =  'index')

【讨论】:

以上是关于如何为熊猫数据框添加唯一的字母数字 ID?的主要内容,如果未能解决你的问题,请参考以下文章

将分组的聚合唯一列添加到熊猫数据框

如何为列中的每个唯一值获取数据框中的项目数[重复]

Firebase:如何为键生成唯一的数字 ID?

如何为数据库中的列生成唯一字符串?

如何为数据库中的一列生成唯一的字符串?

如何为熊猫中的多个变量按列创建所有组合?