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

Python Pandas:如何对差值≤1的元素进行分组

解决按分组后将差值≤1的元素归为子组的问题

这问题我之前处理类似需求时也碰到过,用pandas的分组结合diff和累积求和就能完美解决,咱们一步步来实现:

1. 先构造示例数据

首先把你给出的示例DataFrame用代码还原出来:

import pandas as pd

data = {
    'group_number': [1,1,1,1,1,1,1,2,2,2,2,2,2,2],
    'val': [5,8,12,13,22,26,31,7,16,17,19,29,33,62]
}
df = pd.DataFrame(data)

2. 核心逻辑实现

我们需要定义一个处理每个分组的函数,然后应用到group_number的分组上:

def assign_subgroups(group):
    # 先对组内的val排序,确保差值计算的顺序正确(如果你的原始数据已经有序,这步可以省略)
    sorted_group = group.sort_values('val').reset_index(drop=True)
    # 计算相邻val的差值,第一行没有前一个元素,我们默认它属于新组(差值设为2,大于1)
    diff_over_threshold = sorted_group['val'].diff().fillna(2) > 1
    # 对布尔值累积求和,得到唯一的子组ID
    sorted_group['subgroup'] = diff_over_threshold.cumsum()
    return sorted_group

# 应用到每个group_number分组,得到最终结果
result_df = df.groupby('group_number', group_keys=False).apply(assign_subgroups)

3. 结果说明

运行后你会看到result_df里新增了subgroup列,同一group_number下,subgroup相同的就是满足条件的子组:

  • group_number=1中,val=12和13的subgroup都是3,被归为同一子组
  • group_number=2中,val=16和17的subgroup都是2,被归为同一子组

逻辑拆解

  • diff():计算当前行val与前一行val的差值,第一行返回NaN
  • fillna(2):把第一行的NaN替换成2,这样判断>1时会返回True,作为第一个子组的起始
  • cumsum():对布尔序列累积求和,每遇到一个True(即差值超过1),子组ID就加1,这样连续差值≤1的元素会共享同一个子组ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:22:01