如何使用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
相关产品推荐
相关产品推荐

