Pandas处理近乎重复值:基于id、subject及delta差值的去重需求
处理DataFrame中按id+subject分组且delta差值≤10的重复行
需求说明
我有一个包含id、subject、delta三列的DataFrame,需要实现以下去重规则:
- 两行的
id和subject完全相同,视为重复值; - 同一
id和subject的行中,若两行delta(整数类型)的差值≤10,也视为重复值。
示例输入
import pandas as pd df1 = pd.DataFrame( data={ 'id': [1,2,2,2,3,4,4,4,5], 'subject': ['a','b','b','c','d','e','e','f','g'], 'delta': [100, 110,112,200,120,220,223,400,112] } )
期望输出
df2 = pd.DataFrame( data={ 'id': [1,2,2,3,4,4,5], 'subject': ['a','b','c','d','e','f','g'], 'delta': [100,112,200,120,223,400,112] } )
解决方案
通过分组+标记连续差值的方式实现,核心逻辑是在同一id+subject组内,将差值≤10的delta归为同一子组,仅保留子组的最后一行(对应示例中保留较晚出现的行)。
代码实现
def deduplicate_df(df): def process_group(group): # 计算相邻delta的差值,首次差值设为NaN diffs = group['delta'].diff() # 标记新子组:差值>10的位置为新组起点,累积求和得到子组ID group['sub_group'] = (diffs > 10).cumsum() # 每个子组保留最后一行,移除临时的sub_group列 return group.groupby('sub_group').last().drop(columns='sub_group') # 按id和subject分组处理,合并结果后重置索引 result = df.groupby(['id', 'subject'], group_keys=False).apply(process_group) return result.reset_index(drop=True) # 测试函数 df2 = deduplicate_df(df1) print(df2)
运行结果
id subject delta 0 1 a 100 1 2 b 112 2 2 c 200 3 3 d 120 4 4 e 223 5 4 f 400 6 5 g 112
可选调整
如果需要保留子组中的第一行而非最后一行,只需将代码中的last()替换为first()即可。
内容的提问来源于stack exchange,提问作者rafa.mf_
相关产品推荐
相关产品推荐

