如何为pandas DataFrame添加固定不变的唯一5位字母数字ID
解决方案
核心逻辑是通过确定性哈希算法将名称映射为固定长度的字母数字ID,只要名称本身不发生变化,无论运行多少次脚本、数据行顺序如何调整,生成的ID都能保持完全一致。
实现步骤
- 导入依赖库
import pandas as pd import hashlib
- 定义固定ID生成函数
def generate_fixed_id(name: str, length: int = 5) -> str: # 对名称做MD5哈希,输出结果完全由输入决定 hash_obj = hashlib.md5(name.encode("utf-8")) # 将哈希值转换为整数用于进制转换 hash_int = int(hash_obj.hexdigest(), 16) # 定义36进制字符集:数字0-9 + 大写字母A-Z chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" id_chars = [] for _ in range(length): id_chars.append(chars[hash_int % 36]) hash_int = hash_int // 36 # 反转后取前N位保证长度符合要求 return ''.join(reversed(id_chars))[:length]
- 给DataFrame生成ID列
# 构造示例原始数据 df = pd.DataFrame({ "Name": ["Sam", "Pray", "Brad", "Peter", "Pepe"] }) # 应用函数生成ID列 df["ID"] = df["Name"].apply(generate_fixed_id)
补充说明
- 哈希算法的确定性可以保证同一个名称永远对应同一个ID,无需额外存储映射关系也能保证复现
- 如果担心哈希冲突(概率极低,5位36进制ID有超过6000万种组合),可以适当调长ID长度,或者在哈希时加入自定义固定盐值:将
name.encode("utf-8")修改为("你的自定义固定盐值" + name).encode("utf-8"),还能避免他人反向推导原始名称 - 如果需要兼容已有的历史ID,可以预先维护一份名称到ID的映射字典,生成时先查字典,不存在的再用上述函数生成新ID,保证新旧数据ID一致
内容的提问来源于stack exchange,提问作者s_khan92
相关产品推荐
相关产品推荐

