假设我有一个Pandas数据框架,如下所示:
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行)。本质上,我试图在“第一个”递减值之前得到“最后”数字。
还请注意,有多个测试,所以我可能需要这样做:
myDF.groupby("Test").Something发布于 2017-10-22 05:55:05
使用np.diff,它将自然地将数组的长度减少一个,当我使用np.flatnonzero时,它将识别优先的序号位置。
df.iloc[[np.flatnonzero(np.diff(df.Value) < 0)[0]]]
Test Parameter Value
3 X1 3 0.800632注:
我们可以通过访问底层numpy数组来加快速度。
df.iloc[[np.flatnonzero(np.diff(df.Value.values) < 0)[0]]]解释
获得差异
np.diff(df.Value)
array([ 0.754618, 0.003467, 0.009262, -0.012167, -0.002847, 0.036802])找出差异在哪里是负面的
np.flatnonzero(np.diff(df.Value) < 0)
array([3, 4])我想要第一个
np.flatnonzero(np.diff(df.Value) < 0)[0]
3在iloc中使用双括号
df.iloc[[3]]
Test Parameter Value
3 X1 3 0.800632这个组看起来像
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发布于 2017-10-22 05:29:07
冷速几乎有,只得到第一组,你可以使用孜然,或类似的。
In [11]: df[((df.Value.diff().fillna(1) > 0).cumprod()) == 1].tail(1)
Out[11]:
Test Parameter Value
3 X1 3 0.800632诀窍是:
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是这样的:
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发布于 2017-10-22 05:18:36
使用diff + tail
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操作中这样做的,则类似于(从安迪那里借用):
df.groupby('Test', group_keys=False)\
.apply(lambda x: x[((x.Value.diff().fillna(1) > 0).cumprod()) == 1].tail(1))https://stackoverflow.com/questions/46870692
复制相似问题