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

如何在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,再拼接前缀即可,步骤如下:

  1. 给每组唯一的(First Name, Last Name, DOB)组合生成整数标识
  2. 把整数标识和前缀拼接,替换原姓名字段

完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:10:16