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]')
Interval
s的一个有趣属性是,您可以使用以下命令执行间隔检查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 这是我的代码: 我得到的结果是: 预期输出: 我该怎么解决这个问题拜托
我有一个数据框,如下所示,带有网站名称和每个网站的日期范围。 我希望找到每个站点的开始和结束日期,并按如下方式布置数据框架: 我知道我可以找到整个范围的最小值和最大值,如下所示: 只是不确定最好的方法是将它分别应用于每个站点。