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

如何用Pandas生成重叠区间的布尔矩阵及重叠行索引列

解决区间重叠索引问题

方法思路

利用NumPy的广播机制,无需嵌套循环即可生成判断区间重叠的布尔矩阵,再基于该矩阵提取每行对应的重叠索引并添加为新列。重叠判断逻辑为:对于区间i(起点s1、终点e1)和区间j(起点s2、终点e2),当s1 <= e2且e1 >= s2时两区间重叠。

完整代码实现

import pandas as pd
import numpy as np

# 创建示例DataFrame
intervals_df = pd.DataFrame({"Starts":[0,1,5,10,15,20],"Ends":[4,2,9,14,19,24]})

# 将列转为NumPy数组,方便广播运算
starts = intervals_df['Starts'].values
ends = intervals_df['Ends'].values

# 生成两个布尔矩阵:每行对应当前区间与所有其他区间的比较结果
cond1 = starts[:, np.newaxis] <= ends  # 区间i的起点 <= 区间j的终点
cond2 = ends[:, np.newaxis] >= starts  # 区间i的终点 >= 区间j的起点

# 合并条件得到重叠矩阵(对角线自动为True,因为自身区间必然重叠)
overlap_matrix = cond1 & cond2

# 为每行提取重叠的索引列表,添加为新列
intervals_df['Overlap_Indices'] = [list(np.where(row)[0]) for row in overlap_matrix]

# 输出结果
print(intervals_df)

运行结果

Starts  Ends Overlap_Indices
0       0     4          [0, 1]
1       1     2          [0, 1]
2       5     9             [2]
3      10    14             [3]
4      15    19             [4]
5      20    24             [5]

说明

  • 广播机制让我们可以用O(n²)的时间复杂度完成所有区间对的比较,比循环实现更高效。
  • 布尔矩阵的对角线天然为True,因为每个区间必然与自身重叠,无需额外处理。
  • 若处理超大规模DataFrame,O(n²)的内存占用可能成为瓶颈,此时可考虑分块处理或更优化的算法,但该方案在绝大多数场景下足够实用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:10:32