You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于姓名与出生日期为DataFrame生成起始为10000的唯一ID

基于姓名组合+出生日期生成唯一ID的最优实现

问题背景

我有一个包含姓名(First Name、Middle Name、Last Name)与出生日期(Date of Birth)的DataFrame,数据存在类型混乱、缺失值、异常值等问题,示例数据如下:

Employee type   First Name  Middle Name Last Name   Date of Birth
Employee    Paulo       Cortez  01-01-90
Employee    Paulo   Ricardo Cortez  01-01-90
Employee    Paulo       Cortez  01-01-90
Employee    Paulo       Cortez  02-01-90
Employee            Cortez  
Employee    Paulo       Cortez  $
Employee    Maria   ##  Silva   02-01-90
Employee    o,89    Pedro       s
Employee    Maria       Silva   
Employee    Maria       Silva   02-01-90
Employee    Joao        Augusto 02-01-90
Employee    Maria       Silva   

需要基于姓名组合(First Name+Middle Name+Last Name)+出生日期生成唯一ID列,要求:

  • ID从10000开始
  • 相同的姓名+出生日期组合对应相同ID
  • 不同组合(包括缺失值、异常值的不同情况)对应不同ID

预期效果如下:

Employee type   First Name  Middle Name Last Name   Date of Birth   ID
Employee    Paulo       Cortez  01-01-90    10000
Employee    Paulo   Ricardo Cortez  01-01-90    10001
Employee    Paulo       Cortez  01-01-90    10000
Employee    Paulo       Cortez  02-01-90    10002
Employee            Cortez      10003
Employee    Paulo       Cortez  $   10004
Employee    Maria   ##  Silva   02-01-90    10005
Employee    o,89    Pedro       s   10006
Employee    Maria       Silva       10007
Employee    Maria       Silva   02-01-90    10008
Employee    Joao        Augusto 02-01-90    10009
Employee    Maria       Silva       10007

最优实现方法

使用Pandas的factorize()方法是最高效简洁的方案,它能直接识别唯一组合并分配编码,再调整起始值即可满足需求。

实现步骤

  1. 构建唯一组合键:将姓名三列与出生日期列拼接成一个字符串列,确保所有数据(包括缺失值、异常值)都被当作字符串处理,避免类型冲突。
  2. 生成基础编码:用factorize()对组合键列进行编码,得到从0开始的唯一标识。
  3. 调整ID起始值:将基础编码加上10000,得到符合要求的ID序列。

代码示例

import pandas as pd

# 假设目标DataFrame为df
# 1. 创建组合键列,统一转字符串并拼接
df['combo_key'] = df[['First Name', 'Middle Name', 'Last Name', 'Date of Birth']].astype(str).agg('|'.join, axis=1)

# 2. 生成唯一编码
unique_codes, _ = df['combo_key'].factorize()

# 3. 转换为从10000开始的ID
df['ID'] = unique_codes + 10000

# 可选:删除临时组合键列
df.drop('combo_key', axis=1, inplace=True)

代码说明

  • astype(str):把所有列转为字符串类型,确保缺失值(NaN)、特殊符号(如$、##)都能被正确拼接,避免因类型不一致导致的错误。
  • agg('|'.join, axis=1):用|作为分隔符拼接四列内容,选择不会出现在数据中的分隔符,可避免不同组合被误判为相同。
  • factorize():高效识别唯一组合,按组合首次出现的顺序分配编码,完美满足“相同组合同ID、不同组合不同ID”的要求。
  • 编码加10000:将默认从0开始的编码调整为从10000起始的ID序列。

该方法无需提前清理数据(需求中缺失值、异常值均视为不同组合),执行效率高,代码简洁易维护。


内容的提问来源于stack exchange,提问作者Paulo Cortez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:24:08