如何仅保留Pandas DataFrame尾部重复行的首行(忽略id列)?
解决Pandas中仅移除非首次出现的重复组尾部行问题
你需要保留首次出现的连续重复组(按name和age分组)的所有行,而后续出现的相同组合的连续组仅保留首行、移除该组的尾部重复行。drop_duplicates无法实现这个需求,因为它是全局层面的去重,无法区分连续组的出现批次。
实现步骤
- 标记连续重复组:通过比较当前行与上一行的
name和age,生成连续组的唯一标识。 - 记录每个组合的首次出现组:统计每个
(name, age)组合第一次出现时的连续组标识。 - 筛选目标行:保留首次出现组的所有行,同时保留后续出现组的第一行,移除后续组的尾部行。
完整代码
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
相关产品推荐
相关产品推荐

