如何基于姓名与出生日期为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()方法是最高效简洁的方案,它能直接识别唯一组合并分配编码,再调整起始值即可满足需求。
实现步骤
- 构建唯一组合键:将姓名三列与出生日期列拼接成一个字符串列,确保所有数据(包括缺失值、异常值)都被当作字符串处理,避免类型冲突。
- 生成基础编码:用
factorize()对组合键列进行编码,得到从0开始的唯一标识。 - 调整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
相关产品推荐
相关产品推荐

