在Pandas DataFrame中定义具有高于特定阈值的值的连续区域

tln*_*agy 8 python numpy pandas

我有一个Pandas Dataframe的索引和值介于0和1之间,如下所示:

 6  0.047033
 7  0.047650
 8  0.054067
 9  0.064767
10  0.073183
11  0.077950
Run Code Online (Sandbox Code Playgroud)

我想检索超过一定阈值(例如0.5)的超过5个连续值的区域的起点和终点的元组.所以我会有这样的事情:

 [(150, 185), (632, 680), (1500,1870)]
Run Code Online (Sandbox Code Playgroud)

在第一元组是从索引150开始的区域的情况下,具有35个在行中均高于0.5的值,并且在索引185处包含非包含性的值.

我开始只过滤0.5以上的值

 df = df[df['values'] >= 0.5]
Run Code Online (Sandbox Code Playgroud)

现在我有这样的价值观:

632  0.545700
633  0.574983
634  0.572083
635  0.595500
636  0.632033
637  0.657617
638  0.643300
639  0.646283
Run Code Online (Sandbox Code Playgroud)

我无法显示我的实际数据集,但下面的数据集应该是一个很好的表示

import numpy as np
from pandas import *

np.random.seed(seed=901212)

df = DataFrame(range(1,501), columns=['indices'])
df['values'] = np.random.rand(500)*.5 + .35
Run Code Online (Sandbox Code Playgroud)

收益:

 1  0.491233
 2  0.538596
 3  0.516740
 4  0.381134
 5  0.670157
 6  0.846366
 7  0.495554
 8  0.436044
 9  0.695597
10  0.826591
...
Run Code Online (Sandbox Code Playgroud)

区域(2,4)有两个高于0.5的值.然而,这将太短暂.另一方面,将连续高于0.5的19个值的区域(25,44)添加到列表中.

beh*_*uri 23

您可以通过查看序列和1行移位值来查找每个连续区域的第一个和最后一个元素,然后过滤彼此充分分开的对:

# tag rows based on the threshold
df['tag'] = df['values'] > .5

# first row is a True preceded by a False
fst = df.index[df['tag'] & ~ df['tag'].shift(1).fillna(False)]

# last row is a True followed by a False
lst = df.index[df['tag'] & ~ df['tag'].shift(-1).fillna(False)]

# filter those which are adequately apart
pr = [(i, j) for i, j in zip(fst, lst) if j > i + 4]
Run Code Online (Sandbox Code Playgroud)

所以例如第一个区域将是:

>>> i, j = pr[0]
>>> df.loc[i:j]
    indices    values   tag
15       16  0.639992  True
16       17  0.593427  True
17       18  0.810888  True
18       19  0.596243  True
19       20  0.812684  True
20       21  0.617945  True
Run Code Online (Sandbox Code Playgroud)

  • @Higany这些都是矢量化操作(除了获取实际的索引器),所以应该是非常高效的. (3认同)