将groupby组过滤到组的开头到本地最大值

时间:2018-04-06 15:16:32

标签: python pandas

我正在尝试过滤groupby,只包含组中从开始到第一个local max的那些行,而且我遇到了一些麻烦。

要选择本地最大值,我正在使用x.B.diff().fillna(1) >= 0).cumprod()) == 1].tail(1)

为了得到我想要的行,我想我会尝试使用groupby filter并尝试获得索引小于该组的第一个局部最大值索引的行。 (也许有更好的方法?)

这是我到目前为止所做的工作:

df.groupby('Flag').filter(lambda x: x.index.values < x.index.get_loc(x[((x.B.diff().fillna(1) >= 0).cumprod()) == 1].tail(1)))

有了这个,我现在得到一个TypeError,表示其中一行是无效密钥。我假设我在上面的行中有一些格式错误的代码。

示例数据:

            Flag              B
60738       10.0           27.2
60739       10.0           27.3
60740       10.0           27.4
60741       10.0           27.6
60742       10.0           27.8
60743       10.0           28.1
60744       10.0           28.4
60745       10.0           28.7
60746       10.0           29.0
60747       10.0           29.3
60748       10.0           29.6
60749       10.0           29.9
60750       10.0           29.9
60751       10.0           29.9
60752       10.0           29.9
60753       10.0           29.9
60754       10.0           30.1
60755       10.0           30.4
60756       10.0           30.6
60757       10.0           30.9
60758       10.0           31.1
60759       10.0           31.3
60760       10.0           31.6
60761       10.0           31.9
60762       10.0           32.3
60763       10.0           32.6
60764       10.0           33.0
60765       10.0           33.1
60766       10.0           33.3
60767       10.0           33.5
60768       10.0           33.9
60769       10.0           34.3
60770       10.0           34.6
60771       10.0           35.0
60772       10.0           35.4
60773       10.0           35.7
60774       10.0           36.1
60775       10.0           36.2
60776       10.0           36.1
60777       10.0           36.0
60778       10.0           35.8
60779       10.0           35.5
60780       10.0           35.0
60781       10.0           34.6
60782       10.0           34.0
60783       10.0           33.6
60784       10.0           33.3
60785       10.0           33.0
60786       10.0           32.7
60787       10.0           32.4

我相信这个群体,10,我希望看到分组包含索引60738-60775

1 个答案:

答案 0 :(得分:0)

我认为你需要scipy

from scipy.signal import argrelextrema

df.groupby('Flag').apply(lambda x :x.iloc[argrelextrema(x['B'].values, np.greater)[0][0],:])

Out[1508]: 
60775  Flag     B
Flag             
10.0   10.0  36.2