R语言如何按id重复条件将dataframe拆分为两个无重复id的数据框
实现方案
直接用pandas内置的分组累计计数功能就能实现,不需要写复杂循环:核心逻辑是给同一个id下的所有行按出现顺序编上组内序号,再按序号拆分即可,最终拆分出的每个DataFrame都不会存在重复id。
具体代码
# 为每个id对应的记录标注组内出现次序,计数从0开始 df["group_seq"] = df.groupby("id").cumcount() # 拆分得到两个结果,拆分后删除辅助列、重置索引 df_part1 = df[df["group_seq"] == 0].drop(columns="group_seq").reset_index(drop=True) df_part2 = df[df["group_seq"] == 1].drop(columns="group_seq").reset_index(drop=True)
效果说明
df_part1会保留每个id第一次出现的记录,对应示例里的Joe(id0123)、Susan(id0333)两条数据df_part2会保留每个id第二次出现的记录,对应示例里的Molly(id0333)、Kyle(id0123)两条数据- 如果存在同一个id出现超过2次的情况,只要继续按
group_seq等于2、3……的规则筛选,就能拆出更多无重复id的DataFrame,适配性很强 - 如果部分id只出现1次,这类记录只会被分到
df_part1中,不会触发报错
对应参考结构
你提供的源DataFrame结构如下:
____________________ | id | name | age | |____________________| | 0123 | Joe | 20 | |____________________| | 0123 | Kyle | 45 | |____________________| | 0333 | Susan | 24 | |____________________| | 0333 | Molly | 80 | |____________________|
运行代码后得到的拆分结果和预期完全一致:
第一个拆分结果df_part1:
____________________ | id | name | age | |____________________| | 0123 | Joe | 20 | |____________________| | 0333 | Susan | 24 | |____________________|
第二个拆分结果df_part2:
____________________ | id | name | age | |____________________| | 0333 | Molly | 80 | |____________________| | 0123 | Kyle | 45 | |____________________|
内容的提问来源于stack exchange,提问作者Samuel Disorbo
相关产品推荐
相关产品推荐

