簡體   English   中英

Pandas - 根據行值生成唯一 ID

[英]Pandas - Generate Unique ID based on row values

我想為用戶生成一個基於整數的唯一 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 重復。

感覺我可能以錯誤的方式解決這個問題,因為我找不到太多關於它的文獻!

謝謝

您可以嘗試使用哈希函數。

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

請注意哈希 id 大於 10 位並且是唯一的整數序列。

這是使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM