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

如何将DataFrame指定列的重复值转换为带后缀的唯一值?

解决重复ID转为唯一值的问题

这问题我之前处理过,用pandas的分组计数功能就能轻松实现需求,给你两种实用的方案:

先构建示例数据

首先先还原你给出的测试数据:

import pandas as pd

data = [['tom', 10], ['nick', 15], ['juli', 14], ['juli', 15], ['juli', 16]]
df = pd.DataFrame(data, columns=['Name', 'Age'])

方法1:给所有ID添加序号(包括唯一值)

如果不介意唯一ID也带上后缀(比如tom变成tom_1),可以用groupby+cumcount的组合,代码简洁高效:

# 给每个Name组内的元素添加序号后缀
df['Name'] = df['Name'] + '_' + df.groupby('Name').cumcount().add(1).astype(str)

运行后得到的结果:

Name  Age
0    tom_1   10
1   nick_1   15
2  juli_1   14
3  juli_2   15
4  juli_3   16

方法2:仅给重复ID添加序号

如果想让唯一ID保持原样,只给重复的ID加后缀,可以先标记重复行再处理:

# 标记所有重复的Name行(包括第一次出现的)
mask = df['Name'].duplicated(keep=False)
# 仅给重复的Name添加序号后缀
df.loc[mask, 'Name'] = df.loc[mask, 'Name'] + '_' + df[mask].groupby('Name').cumcount().add(1).astype(str)

运行后就得到你想要的期望结果:

Name  Age
0      tom   10
1     nick   15
2  juli_1   14
3  juli_2   15
4  juli_3   16

代码解释

  • groupby('Name').cumcount():按Name分组后,对每个组内的元素从0开始计数,比如juli组的三个元素会得到0、1、2
  • .add(1):把计数从0起始改成1起始,匹配示例里的序号格式
  • .astype(str):将数字类型的计数转为字符串,才能和原Name拼接
  • duplicated(keep=False):这个参数会标记所有重复出现的行(默认keep='first'只会标记除第一次外的重复行),这样我们就能选中所有需要修改的重复ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:43