如何将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
相关产品推荐
相关产品推荐

