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)