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

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

    Name
    Sam
    Pray
    Brad

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

这是所需的输出:

    Name         ID
    Sam          X25TR
    Peter        WE558
    Pepe         TR589

【问题讨论】:

    标签: python pandas unique


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2021-08-12
      相关资源
      最近更新 更多