在pandas Intervalindex中查找匹配间隔

在0.20中有一个名为Intervalindexnew的有趣API,它允许您创建间隔索引

给出一些示例数据:

数据=[(893.1516130000001903.91870999999),
(882.384516, 893.1516130000001),
(817.781935, 828.549032)]

您可以按如下方式创建索引:

idx=pd.IntervalIndex.from\u元组(数据)
打印(idx)
区间指数([(893.151613903.91871],(882.384516893.151613],(817.781935828.549032])
右‘,右‘,
dtype='interval[float64]')

Intervals的一个有趣特性是,您可以使用中的执行间隔检查:

打印(y[-1])
区间(817.781934999998828.549032000000001,右关闭)
打印(y轴820英寸[-1])
符合事实的
打印(1000英寸y[-1])
错误的

我想知道如何将此操作应用于整个索引。例如,给定某个数字900,如何检索该数字所对应的布尔区间掩码

我能想到:

m=[900英寸y代表y在idx中]
打印(m)
[真,假,假]

有更好的方法吗

如果您对性能感兴趣,IntervalIndex将针对搜索进行优化。使用.get\u loc.get\u indexer使用内部构建的IntervalTree(如二叉树),它是在首次使用时构建的

[29]on

:idx=pd.IntervalIndex.from_元组(数据*10000)
[30]on:%timeit-n1-r1idx.map(λx:900英寸x)
每个回路92.8 ms±0 ns(1次运行的平均值±标准偏差,每个回路1次)
At[40]on:%timeit-n1-r1idx.map(λx:900英寸x)
每个回路42.7 ms±0 ns(1次运行的平均值±标准偏差,每个回路1次)
#构造树和搜索
At[31]:%timeit-n1-r1idx.get_loc(900)
每个回路4.55 ms±0 ns(1次运行的平均值±标准偏差,每个回路1次)
#随后
At[32]:%timeit-n1-r1idx.get_loc(900)
每个回路137µs±0 ns(1次运行的平均值±标准偏差,每个回路1次)
#对于单个索引器,您可以做得更好(请注意,这是
#稍微了解一下impl
At[27]:%timeit np.arange(len(idx))[(900>idx.left)&(900<=idx.right)]
每个回路203µs±1.55µs(7次运行的平均±标准偏差,每个1000个回路)

注意.get_loc()返回一个索引器(实际上比布尔数组更有用,但它们可以相互转换)

[38]on

:idx.map(λx:900英寸x)
...: 
Output[38]:
索引([真,假,假,真,假,假,真,假,假,假,真,
...
False,True,False,False,True,False,True,False,False],dtype='object',length=30000)
In[39]:idx.get_loc(900)
...: 
Out[39]:数组([299971998710008,…,1999219989,0])

返回布尔数组将转换为索引器数组

[5]on

:np.arange(len(idx))[idx.map(lambda x:900 In x).values.astype(bool)]
Out[5]:数组([0,3,6,…,29991,29994,29997])

下面是.get_loc()和.get_indexer()返回的内容:

[6]on

:np.sort(idx.get_loc(900))
Out[6]:数组([0,3,6,…,29991,29994,29997])

发表评论