如何在Pandas分组后实现姓名的递增式匿名化?
问题描述
最近开始用Pandas处理数据,需要先基于名字、姓氏、出生日期这三个字段分组找到唯一的人物组合,再把姓名转换成递增的匿名标识(比如F1、L1这种格式)。尝试过groupBy的transform和apply函数但没成功,求实现方法。
示例原数据:
First Name Last Name DOB 0 Bob One 28/05/1973 1 Bob One 28/05/1973 2 Ana Two 28/07/1991 3 Ana Two 28/07/1991 4 Ana Two 28/07/1991 5 Jim Three 07/01/1994
期望结果:
First Name Last Name DOB 0 F1 L1 28/05/1973 1 F1 L1 28/05/1973 2 F2 L2 28/07/1991 3 F2 L2 28/07/1991 4 F2 L2 28/07/1991 5 F3 L3 07/01/1994
解决方案
可以用pd.factorize()给每个唯一的人物组合生成递增ID,再拼接前缀即可,步骤如下:
- 给每组唯一的(First Name, Last Name, DOB)组合生成整数标识
- 把整数标识和前缀拼接,替换原姓名字段
完整代码:
import pandas as pd # 构造原数据 df = pd.DataFrame({ 'First Name': ['Bob', 'Bob', 'Ana', 'Ana', 'Ana', 'Jim'], 'Last Name': ['One', 'One', 'Two', 'Two', 'Two', 'Three'], 'DOB': ['28/05/1973', '28/05/1973', '28/07/1991', '28/07/1991', '28/07/1991', '07/01/1994'] }) # 生成唯一组合的整数标识(从0开始) ids, _ = pd.factorize(df[['First Name', 'Last Name', 'DOB']].apply(tuple, axis=1)) # 替换姓名为F+序号、L+序号的格式 df['First Name'] = 'F' + (ids + 1).astype(str) df['Last Name'] = 'L' + (ids + 1).astype(str) print(df)
代码说明
pd.factorize()会自动识别三个字段组成的唯一元组,转换成连续的整数序列,刚好作为匿名标识的序号基础- 给整数加1是为了让标识从1开始(对应F1、L1),再转成字符串和前缀拼接
- 直接赋值回原字段就能完成批量替换,比groupBy的transform操作更高效直接
内容的提问来源于stack exchange,提问作者Felipe Mosso
相关产品推荐
相关产品推荐

