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

Pandas实现两列值重叠的连续数据行折叠合并

Pandas 连续重叠区间折叠聚合实现

实现思路

针对相邻行区间重叠/衔接(当前行age_end等于下一行age_start也算满足合并规则)的聚合需求,不需要写循环逐行判断,用pandas内置的累计计算方法就能高效实现,支持任意长度的连续行合并:

  • 第一步:逐行判断当前行是否和前面的连续区间断开,断开则新增分组ID
  • 第二步:按分组ID聚合,每组取age_start最小值、age_end最大值即可

完整代码

import pandas as pd

# 加载/构造原始数据
df = pd.DataFrame({
    'age_start': [2, 6, 11, 17, 21, 27, 30],
    'age_end': [6, 10, 16, 18, 25, 30, 34]
})

# 生成分组标记:当前行起始值大于之前所有行的最大结束值时,新增分组
df['group_tag'] = (df['age_start'] > df['age_end'].shift(fill_value=0).cummax()).cumsum()

# 分组聚合得到结果
result = df.groupby('group_tag', as_index=False).agg(
    age_start=('age_start', 'min'),
    age_end=('age_end', 'max')
).drop(columns='group_tag')

结果验证

执行代码后输出的result完全匹配预期结果:

age_startage_end
210
1116
1718
2125
2734

关键逻辑说明

  • shift(fill_value=0)把age_end列向下移一位,让每一行能拿到前一行的结束值,第一行用0填充避免空值
  • cummax()逐行计算累计到当前位置的最大结束值,哪怕前面有N行连续重叠的区间,也能拿到整个连续块的最大结束值
  • 布尔值累加cumsum()会自动给每个连续块分配唯一的分组ID,不需要手动循环计数
  • 如果原始数据不是按区间顺序排列的,先执行df = df.sort_values('age_start').reset_index(drop=True)再跑后续逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:15:49