当前位置: 首页 > 面试题库 >

在熊猫Intervalindex中查找匹配间隔

赫连宏伯
2023-03-14
问题内容

Intervalindex在0.20中有一个有趣的API,称为new,可让您创建间隔索引。

给定一些示例数据:

data = [(893.1516130000001, 903.9187099999999),
 (882.384516, 893.1516130000001),
 (817.781935, 828.549032)]

您可以这样创建索引:

idx = pd.IntervalIndex.from_tuples(data)

print(idx)
IntervalIndex([(893.151613, 903.91871], (882.384516, 893.151613], (817.781935, 828.549032]]
              closed='right',
              dtype='interval[float64]')

Intervals的一个有趣属性是,您可以使用以下命令执行间隔检查in

print(y[-1])
Interval(817.78193499999998, 828.54903200000001, closed='right')

print(820 in y[-1])
True

print(1000 in y[-1])
False

我想知道如何将此操作应用于整个索引。例如,给定一些数字900,我如何检索该数字适合的间隔的布尔掩码?

我可以想到:

m = [900 in y for y in idx]
print(m)
[True, False, False]

有更好的方法可以做到这一点吗?


问题答案:

如果您对性能感兴趣,可以对IntervalIndex进行优化以进行搜索。使用.get_loc.get_indexer使用内部构建的IntervalTree(如二叉树),该树是在首次使用时构造的。

In [29]: idx = pd.IntervalIndex.from_tuples(data*10000)

In [30]: %timeit -n 1 -r 1 idx.map(lambda x: 900 in x)
92.8 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

In [40]: %timeit -n 1 -r 1 idx.map(lambda x: 900 in x)
42.7 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

# construct tree and search
In [31]: %timeit -n 1 -r 1 idx.get_loc(900)
4.55 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

# subsequently
In [32]: %timeit -n 1 -r 1 idx.get_loc(900)
137 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

# for a single indexer you can do even better (note that this is
# dipping into the impl a bit
In [27]: %timeit np.arange(len(idx))[(900 > idx.left) & (900 <= idx.right)]
203 µs ± 1.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

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

In [38]: idx.map(lambda x: 900 in x)
    ...: 
Out[38]: 
Index([ True, False, False,  True, False, False,  True, False, False,  True,
       ...
       False,  True, False, False,  True, False, False,  True, False, False], dtype='object', length=30000)

In [39]: idx.get_loc(900)
    ...: 
Out[39]: array([29997,  9987, 10008, ..., 19992, 19989,     0])

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

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

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

In [6]: np.sort(idx.get_loc(900))
Out[6]: array([    0,     3,     6, ..., 29991, 29994, 29997])


 类似资料:
  • 问题内容: 我有一个pandas.DataFrame,它在连续的时间点进行了测量。与每次测量一起,被观察系统在每个时间点都有不同的状态。因此,DataFrame还包含一列,其中包含每次测量时系统的状态。状态更改比测量间隔慢得多。结果,指示状态的列可能看起来像这样(索引:状态): 是否有一种简单的方法来检索连续相等状态的每个段的索引。那意味着我想得到这样的东西: 结果也可能与普通列表有所不同。 到目

  • 新版本的Pandas使用以下界面加载Excel文件: 但是如果我不知道可用的床单呢? 例如,我正在使用excel文件,这些文件包含以下表格 数据1,数据2。。。,数据N,foo,bar 但是我不知道什么是先验的。 有没有办法从Pandas中的excel文档中获取工作表列表?

  • 问题内容: 我有两个系列,并以大熊猫为单位,想计算相交点,即该系列的所有值都相同的地方。 我将如何使用该功能执行此操作?我一直在试图解决它,但一直未能(我不想计算上的索引交集和,但对值)。 问题答案: 将两个系列放置在Python的set容器中,然后使用set相交方法: 然后根据需要转换回列表。 刚注意到标签中的熊猫。可以转换为: 从注释中,我将其更改为更Python化的表达式,该表达式更短且更易

  • 问题内容: 我试图在熊猫中绘制一些数据,并且内置的绘图功能可以方便地在每列中绘制一行。我要做的是根据我进行的分类为每行手动分配颜色。 以下作品: 但是,当我的索引是整数时,它将不再起作用并抛出为KeyError: 我的理解是,当使用整数索引时,它必须以某种方式从0开始。这是我的猜测,因为以下内容同样适用: 我的问题是: 这是怎么回事 假设我有一个不是从0开始或不是由连续数字组成的整数索引,那么我如

  • 我有两个具有多列的数据帧。 我想比较df1['id']和df2['id'],并返回一个新的df,其中列['correct_id']具有匹配值。例子: df1: df2 这是我的代码: 我得到的结果是: 预期输出: 我该怎么解决这个问题拜托

  • 我有一个数据框,如下所示,带有网站名称和每个网站的日期范围。 我希望找到每个站点的开始和结束日期,并按如下方式布置数据框架: 我知道我可以找到整个范围的最小值和最大值,如下所示: 只是不确定最好的方法是将它分别应用于每个站点。