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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:12:44