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

