在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])