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

如何使用pandas将衔接的区间数据分组合并为连续块

Pandas 合并首尾衔接的连续区间

问题场景

现有如下结构的区间DataFrame:

start end
0  10    20
1  30    35
2  20    25
3  35    40
4  40    45
5  60    70
6  70    80

需要将首尾衔接(前一个区间的end值等于后一个区间的start值)的连续区间合并,最终输出如下格式的字典列表:

[{"start":10,"end":25},{"start":30,"end":45},{"start":60,"end":80}]

实现思路

  • 先按start列对所有区间做升序排序,避免反复全表扫描匹配衔接区间
  • 从排序后最小的区间开始,维护当前正在合并的连续区间块的起止值
  • 逐行遍历后续区间,若当前区间和正在合并的块首尾衔接,则更新当前块的结束值;若不衔接,就将当前块存入结果,以当前区间为起点开启新的合并块
  • 遍历完成后将最后一个合并块存入结果即可

完整代码

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'start': [10, 30, 20, 35, 40, 60, 70],
    'end': [20, 35, 25, 40, 45, 70, 80]
})

# 按区间起始值升序排序
df_sorted = df.sort_values('start').reset_index(drop=True)

merged_result = []
# 初始化第一个合并块
curr_start = df_sorted.loc[0, 'start']
curr_end = df_sorted.loc[0, 'end']

for _, row in df_sorted.iloc[1:].iterrows():
    s, e = row['start'], row['end']
    # 严格首尾衔接则合并
    if s == curr_end:
        curr_end = e
    else:
        # 中断则保存当前块,开启新块
        merged_result.append({'start': curr_start, 'end': curr_end})
        curr_start, curr_end = s, e
# 补充最后一个合并块
merged_result.append({'start': curr_start, 'end': curr_end})

print(merged_result)

运行代码后输出结果和预期完全一致:

[{'start': 10, 'end': 25}, {'start': 30, 'end': 45}, {'start': 60, 'end': 80}]

注:如果后续需要兼容区间重叠、存在固定间隙也合并的场景,只需要修改衔接判断的条件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:06:19