我正在尝试过滤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
答案 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