Pandas:DataFrame存在重复ID,如何生成唯一标识?
解决方法:生成结合原ID与组内计数的唯一NewID
这问题我熟!想要生成你说的这种11、21、22、41格式的唯一ID,用pandas的groupby配合cumcount就能轻松实现,给你一步步拆解:
1. 先构造你的目标DataFrame
首先先把你提到的数据集用代码还原出来:
import pandas as pd df = pd.DataFrame({ 'id': [1, 2, 2, 4], 'animal': ['dog', 'cat', 'bear', 'mouse'], 'Seq': [14, 17, 19, 23] })
2. 生成组内递增计数器
按id分组后,用cumcount()给每个组内的行分配序号(注意cumcount默认从0开始,所以要加1让计数从1起始):
# 新增组内计数器列,从1开始计数 df['counter'] = df.groupby('id').cumcount() + 1
3. 生成唯一NewID
有两种常用方式生成你要的NewID,选哪种看你的需求:
方式一:字符串拼接(适配多位数ID)
如果你的id可能是多位数(比如10、100),用字符串拼接更稳妥,避免数值计算导致的位数混乱:
df['NewID'] = df['id'].astype(str) + df['counter'].astype(str)
方式二:数值计算(适合个位数ID)
如果你的id都是个位数,直接用数值组合更高效,得到的是数值型的NewID:
df['NewID'] = df['id'] * 10 + df['counter']
最终结果
执行完上面的代码后,你的DataFrame会变成这样:
| id | animal | Seq | counter | NewID |
|---|---|---|---|---|
| 1 | dog | 14 | 1 | 11 |
| 2 | cat | 17 | 1 | 21 |
| 2 | bear | 19 | 2 | 22 |
| 4 | mouse | 23 | 1 | 41 |
简化写法(可选)
如果你不需要保留counter列,可以用链式操作一步到位:
# 字符串拼接版 df['NewID'] = df.groupby('id').cumcount().add(1).astype(str).radd(df['id'].astype(str)) # 数值计算版 df['NewID'] = df['id'] * 10 + df.groupby('id').cumcount().add(1)
内容的提问来源于stack exchange,提问作者user1788504
相关产品推荐
相关产品推荐

