首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为每个群体找到第一个局部最大值?

如何为每个群体找到第一个局部最大值?
EN

Stack Overflow用户
提问于 2017-10-22 05:09:30
回答 4查看 1.5K关注 0票数 8

假设我有一个Pandas数据框架,如下所示:

代码语言:javascript
复制
Test Parameter Value

X1     0        0.033285423511615113
X1     1        0.78790279861666179
X1     2        0.79136989638378297
X1     3        0.80063190842016707
X1     4        0.7884653622402551
X1     5        0.78561849214309198...
...
X1     22       22: 0.82241991278171311...
...
X2 ...

我想得到参数值为3的行,即第一次下降之前最后一次增加值的行。注意,稍后我们可能有更高的值(如第22行)。本质上,我试图在“第一个”递减值之前得到“最后”数字。

还请注意,有多个测试,所以我可能需要这样做:

代码语言:javascript
复制
myDF.groupby("Test").Something
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-22 05:55:05

使用np.diff,它将自然地将数组的长度减少一个,当我使用np.flatnonzero时,它将识别优先的序号位置。

代码语言:javascript
复制
df.iloc[[np.flatnonzero(np.diff(df.Value) < 0)[0]]]

  Test  Parameter     Value
3   X1          3  0.800632

注:

我们可以通过访问底层numpy数组来加快速度。

代码语言:javascript
复制
df.iloc[[np.flatnonzero(np.diff(df.Value.values) < 0)[0]]]

解释

获得差异

代码语言:javascript
复制
np.diff(df.Value)

array([ 0.754618,  0.003467,  0.009262, -0.012167, -0.002847,  0.036802])

找出差异在哪里是负面的

代码语言:javascript
复制
np.flatnonzero(np.diff(df.Value) < 0)

array([3, 4])

我想要第一个

代码语言:javascript
复制
np.flatnonzero(np.diff(df.Value) < 0)[0]

3

iloc中使用双括号

代码语言:javascript
复制
df.iloc[[3]]

  Test  Parameter     Value
3   X1          3  0.800632

这个组看起来像

代码语言:javascript
复制
f = lambda d: d.iloc[[np.flatnonzero(np.diff(d.Value.values) < 0)[0]]]
df.groupby('Test').apply(f)

       Test  Parameter     Value
Test                            
X1   3   X1          3  0.800632
票数 6
EN

Stack Overflow用户

发布于 2017-10-22 05:29:07

冷速几乎有,只得到第一组,你可以使用孜然,或类似的。

代码语言:javascript
复制
In [11]: df[((df.Value.diff().fillna(1) > 0).cumprod()) == 1].tail(1)
Out[11]:
  Test  Parameter     Value
3   X1          3  0.800632

诀窍是:

代码语言:javascript
复制
In [12]: (df.Value.diff().fillna(1) > 0)
Out[12]:
0     True
1     True
2     True
3     True
4    False
5    False
6     True
Name: Value, dtype: bool

In [13]: (df.Value.diff().fillna(1) > 0).cumprod()
Out[13]:
0    1
1    1
2    1
3    1
4    0
5    0
6    0
Name: Value, dtype: int64

注意:我的df是这样的:

代码语言:javascript
复制
In [21]: df
Out[21]:
  Test  Parameter     Value
0   X1          0  0.033285
1   X1          1  0.787903
2   X1          2  0.791370
3   X1          3  0.800632
4   X1          4  0.788465
5   X1          5  0.785618
6   X1         22  0.822420
票数 7
EN

Stack Overflow用户

发布于 2017-10-22 05:18:36

使用diff + tail

代码语言:javascript
复制
df    
  Test  Parameter     Value
0   X1          0  0.033285
1   X1          1  0.787903
2   X1          2  0.791370
3   X1          3  0.800632
4   X1          4  0.788465
5   X1          5  0.785618

df[df.Value.diff().gt(0)].tail(1)    
  Test  Parameter     Value
3   X1          3  0.800632

这将检索最后一个局部极小值。如果您想要第一个局部极小值,请参考涉及到安迪·海登的解决方案cumprod

如果您是在groupby操作中这样做的,则类似于(从安迪那里借用):

代码语言:javascript
复制
df.groupby('Test', group_keys=False)\
      .apply(lambda x: x[((x.Value.diff().fillna(1) > 0).cumprod()) == 1].tail(1))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46870692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档