如何为熊猫数据框添加唯一的字母数字 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?的主要内容,如果未能解决你的问题,请参考以下文章