Pandas: Encuentra el índice de la fila con el segundo valor más alto

Estoy intentando obtener el índice de la fila con el segundo valor más alto después de hacer groupby pero no obtengo el resultado correcto

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]}) 

Haciendo esto

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

está regresando

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

Para el grupo s2, se debe devolver el índice 3 del dataframe original.

Ya que ‘Valor’ ya está ordenado puedes usar 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 

De lo contrario, primero df = df.sort_values("Value") por Valor, df = df.sort_values("Value") .

Si quieres lo último (si hay menos de dos en un grupo determinado), también puedes hacerlo.

 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 

Una función relacionada es la tail (para obtener los dos últimos elementos):

 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 

OK tengo la respuesta excepto por una cosa. Este código parece funcionar

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

Lo único que no entiendo ahora es que incluso con un grupo de una fila solo se devuelve esa fila. Estaba pensando que puede ser x!=max(x) check excluiría esa fila.