在 Pandas DataFrame 中界定值高于特定阈值的连续区域

2023-11-23

我有一个 Pandas Dataframe,其索引和值在 0 到 1 之间,如下所示:

 6  0.047033
 7  0.047650
 8  0.054067
 9  0.064767
10  0.073183
11  0.077950

我想检索元组超过 5 个连续值均超过某个阈值(例如 0.5)的区域的起点和终点。这样我就会有这样的东西:

 [(150, 185), (632, 680), (1500,1870)]

其中第一个元组属于从索引 150 开始的区域,有 35 个行中全部大于 0.5 的值,并以索引 185 结束(不包含)。

我首先只过滤大于 0.5 的值,如下所示

 df = df[df['values'] >= 0.5]

现在我有这样的价值观:

632  0.545700
633  0.574983
634  0.572083
635  0.595500
636  0.632033
637  0.657617
638  0.643300
639  0.646283

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

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

产量:

 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
...

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


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

# 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]

例如,第一个区域是:

>>> 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pandas DataFrame 中界定值高于特定阈值的连续区域 的相关文章

随机推荐