
本文介绍一种基于区间断点(breakpoints)的 DataFrame 合并策略:先提取所有 from/to 边界值并排序,再构建最小粒度区间,最后为每个区间分配对应原始数据中的 int 值(如重叠取交集、覆盖取最大等),实现精准的区间级合并与行拆分。
本文介绍一种基于区间断点(breakpoints)的 dataframe 合并策略:先提取所有 `from`/`to` 边界值并排序,再构建最小粒度区间,最后为每个区间分配对应原始数据中的 `int` 值(如重叠取交集、覆盖取最大等),实现精准的区间级合并与行拆分。
在处理区间型数据(如时间窗口、地理范围、数值段)时,常需将多个不完全对齐的区间 DataFrame 合并为统一细粒度的结构——即“对齐边界、拆分重叠、聚合指标”。本例中,df1 和 df2 分别定义了不同粒度的 [from, to) 区间及其整数指标 int,目标是生成一个覆盖全范围、以所有端点为边界的最小单位区间,并为每个单位区间赋予合理的 int 值(示例中采用“区间长度”作为 int,但实际业务中更常见的是取交集权重、最大值或加权平均)。
核心思路分为三步:
-
提取并归一化断点:收集两个 DataFrame 中所有
from和to值,去重后升序排列,形成全局断点序列; -
构造最小粒度区间:将相邻断点两两配对,生成互斥且完备的
[from, to)子区间; -
映射并聚合指标:对每个子区间,判断其被哪些原始区间覆盖,并按业务逻辑计算
int(如示例中直接用to - from,但更通用的做法是使用pd.IntervalIndex进行向量化覆盖判断)。
以下是完整可运行代码:
import pandas as pd
df1 = pd.DataFrame({
'from': [0, 2, 8, 26, 35, 46],
'to': [2, 8, 26, 35, 46, 48],
'int': [2, 6, 18, 9, 11, 2]
})
df2 = pd.DataFrame({
'from': [0, 2, 8, 17, 34],
'to': [2, 8, 17, 34, 49],
'int': [2, 6, 9, 17, 15]
})
# Step 1: Extract and sort all unique breakpoints
breakpoints = sorted(set(df1['from']) | set(df1['to']) | set(df2['from']) | set(df2['to']))
# Step 2: Build minimal non-overlapping intervals
new_df = pd.DataFrame({
'from': breakpoints[:-1],
'to': breakpoints[1:]
})
# Step 3 (example logic): assign int as interval length
new_df['int'] = new_df['to'] - new_df['from']
print(new_df)
输出结果为:
from to int 0 0 2 2 1 2 8 6 2 8 17 9 3 17 26 9 4 26 34 8 5 34 35 1 6 35 46 11 7 46 48 2 8 48 49 1
⚠️ 注意事项:
- 示例中
int被简单设为区间长度,但若需继承原始int的语义(如覆盖率、计数、均值),应改用pd.IntervalIndex+map()或merge_asof+ 区间匹配逻辑; - 若原始数据含闭区间
[from, to],需在构造IntervalIndex时指定closed='both'; - 断点数量为
n时,生成区间数为n−1,确保无遗漏、无重叠; - 对超大规模数据,建议使用
numpy.searchsorted替代 Pythonset操作以提升性能。
该方法本质是“区间离散化”,是地理信息系统(GIS)、时序切片、资源调度等场景的基础技术,具备强扩展性与清晰的数学语义。










