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

如何仅保留Pandas DataFrame尾部重复行的首行(忽略id列)?

解决Pandas中仅移除非首次出现的重复组尾部行问题

你需要保留首次出现的连续重复组(按name和age分组)的所有行,而后续出现的相同组合的连续组仅保留首行、移除该组的尾部重复行。drop_duplicates无法实现这个需求,因为它是全局层面的去重,无法区分连续组的出现批次。

实现步骤

  1. 标记连续重复组:通过比较当前行与上一行的name和age,生成连续组的唯一标识。
  2. 记录每个组合的首次出现组:统计每个(name, age)组合第一次出现时的连续组标识。
  3. 筛选目标行:保留首次出现组的所有行,同时保留后续出现组的第一行,移除后续组的尾部行。

完整代码

import pandas as pd

# 原始数据
df = pd.DataFrame({
    'id':[1,2,3,4,5,6,7,8,9,10], 
    'name': ['mary','mary','mary','tom','tom','john','sarah','tom','tom','tom'], 
    'age': [30,30,30,25,25,28,36,25,25,25]
})

# 1. 生成连续重复组的标识
df['group_id'] = df[['name', 'age']].ne(df[['name', 'age']].shift()).any(axis=1).cumsum()

# 2. 获取每个(name, age)组合的首次出现组
first_group_map = df.groupby(['name', 'age'])['group_id'].first()
df['first_group'] = df.apply(lambda row: first_group_map[(row['name'], row['age'])], axis=1)

# 3. 筛选符合条件的行:要么是首次组的所有行,要么是非首次组的第一行
mask = (df['group_id'] == df['first_group']) | (df.groupby('group_id').cumcount() == 0)
result = df[mask].drop(columns=['group_id', 'first_group'])

print(result)

输出结果

id    name  age
0   1    mary   30
1   2    mary   30
2   3    mary   30
3   4     tom   25
4   5     tom   25
5   6    john   28
6   7   sarah   36
7   8     tom   25

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:23:20