【发布时间】:2014-10-29 08:33:17
【问题描述】:
我有一个带有两个整数列 START 和 END 的 pandas 数据帧 INT,表示间隔 [START, END]。我需要检查整数 POS 是否落在这些间隔之一中,即是否存在 START
我有一个我认为是有效的解决方案,按顺序检查 POS 值并跟踪最近的间隔,这样我就可以开始希望接近我想要的间隔(如果它存在的话),我只需要在区间表中前进,检查是否有:
max_inter = max(intervals.END - intervals.START)
last_index = 0
def find(POS):
global last_index, max_inter, intervals
i = last_index
while i > 0 and intervals.START.iloc[i] > POS - max_inter:
i -= 1
found = False
while i < len(intervals) - 1 and intervals.START.iloc[i]) <= POS:
if intervals.START.iloc[i] <= POS and POS <= intervals.END.iloc[i]:
found = True
break
i += 1
last_index = i
return found
但是这比我想要的慢,因为它是在纯 python 中,有没有一种有效的方法可以在 pandas 或 numpy 中做到这一点?
我已经尝试过类似的东西
any((intervals.START <= POS) & (POS <= intervals.END))
但这比我的解决方案慢得多。有什么建议吗?我是否缺少库函数?
谢谢
编辑:也许我应该提到我需要检查一个(排序的)POS 值系列,我目前正在使用positions.map(find) 来生成一个布尔系列,也许有更好的方法可以做到这一点。我还必须为数千个位置和间隔执行此操作,这就是我对速度感兴趣的原因。
【问题讨论】:
-
intervals[(intervals['START'] <= POS) & (POS <= intervals['END'])]不起作用吗? -
@EdChum 它可以工作,但速度要慢得多,即使它使用库函数,因为它每次都需要检查整个间隔表。我需要更高效的东西。
-
另一个想法是像您已经订购 START 和 END 并在 START 和 END 上执行
np.searchsorted传递 POS ,然后比较索引位置是否在此范围内,如果您了解我的话意思
标签: python pandas numpy intervals interval-tree