如何在R中为dataframe的id字段重复项分配符合规则的唯一新值
实现方案(Python + Pandas)
直接按以下步骤操作即可,代码可直接运行:
完整代码示例
import pandas as pd # 1. 构造示例数据,可替换为自己的DataFrame df = pd.DataFrame({ 'id': ['AB22', 'AB25', 'AB25', 'AB25', 'AB50', 'AB35', 'AB35', 'AB40'], 'children': [2, 1, 1, 3, 2, 1, 1, 1], 'age': [31, 27, 25, 33, 40, 37, 39, 41] }) # 2. 提取所有id的数值部分,计算最大值 max_id_num = df['id'].str.extract(r'(\d+)', expand=False).astype(int).max() # 3. 标记重复id:每个id第一次出现的记录保留,后续重复的标记为需要修改 duplicate_flag = df['id'].duplicated(keep='first') # 4. 生成新的id数值序列,从原最大数值+1开始递增 new_id_count = duplicate_flag.sum() new_num_seq = range(max_id_num + 1, max_id_num + 1 + new_id_count) # 5. 替换重复id # 固定前缀为AB的写法: df.loc[duplicate_flag, 'id'] = [f'AB{num}' for num in new_num_seq] # 如果id前缀不固定,用下面的写法替代上行即可: # prefix_list = df.loc[duplicate_flag, 'id'].str.extract(r'([A-Za-z]+)', expand=False) # df.loc[duplicate_flag, 'id'] = [f"{prefix}{num}" for prefix, num in zip(prefix_list, new_num_seq)] # 输出结果验证 print(df)
逻辑说明
- 用正则提取id中的数字部分,确保新生成的id数值一定大于原所有id的数值最大值
duplicated(keep='first')保证每个id的第一条记录不变,只有后续重复的条目会被分配新id- 新id的前缀默认和原id前缀保持一致,适配前缀不固定的场景
内容的提问来源于stack exchange,提问作者Zhyur
相关产品推荐
相关产品推荐

