2015-11-14 59 views
4

我試圖做GROUPBY後得到第二高值的行的索引,但我沒有得到正確的結果熊貓:查找與第二最高值的行指數

df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'count':[3,2,5,10,10,6]}) 

這樣做

df.iloc[df.groupby(['Mt'])['Value'].apply(lambda x: (x!=max(x)).idxmax())] 

在返回

Mt Sp Value count 
0 s1 a 1 3 
2 s2 c 3 5 
5 s3 f 6 6 

對於組s2中,原始數據幀的建議立即進行刪除索引3 d被退回。

回答

0

好的我得到了答案,除了一件事。此代碼似乎工作

df.iloc[df.groupby(['Mt'])['Value'].apply(lambda x: (x!=max(x)).order(ascending=False).head(1).index[0])] 

我不明白現在唯一的事情,即使只有一行的一組只有該行被返回。我在想,可能是x!=max(x)檢查會排除那一行。

3

由於 '價值' 已經排序,你可以使用nth

In [11]: g = df.groupby("Mt", as_index=False) 

In [12]: g.nth(-2) 
Out[12]: 
    Mt Sp Value count 
0 s1 a  1  3 
3 s2 d  4  10 

否則,我第一個排序值,df = df.sort_values("Value")

如果你想在最後一個(如果同組中有超過兩少),你能抓住這太

In [21]: g = df.groupby("Mt") 

In [22]: res = g.nth(-1) 

In [23]: res.update(g.nth(-2)) 

In [24]: res 
Out[24]: 
    Sp Value count 
Mt 
s1 a  1  3 
s2 d  4  10 
s3 f  6  6 

一個相關的函數是tail(拿到最後兩個元素) :

In [31]: g.tail(2) 
Out[31]: 
    Mt Sp Value count 
0 s1 a  1  3 
1 s1 b  2  2 
3 s2 d  4  10 
4 s2 e  5  10 
5 s3 f  6  6