Подтвердить что ты не робот

Извлечь строку с максимальным значением в группе pandas dataframe

Здесь задается аналогичный вопрос: Python: получение строки, которая имеет максимальное значение в группах с помощью groupby

Однако мне просто нужна одна запись на группу, даже если в этой группе имеется более одной записи с максимальным значением.

В приведенном ниже примере мне нужна одна запись для "s2". Для меня неважно, какой из них.

>>> df = 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
   Mt Sp  Value  count
0  s1  a      1      3
1  s1  b      2      2
2  s2  c      3      5
3  s2  d      4     10
4  s2  e      5     10
5  s3  f      6      6
>>> idx = df.groupby(['Mt'])['count'].transform(max) == df['count']
>>> df[idx]
   Mt Sp  Value  count
0  s1  a      1      3
3  s2  d      4     10
4  s2  e      5     10
5  s3  f      6      6
>>> 
4b9b3361

Ответ 1

Вы можете использовать first

In [14]: df.groupby('Mt').first()
Out[14]: 
   Sp  Value  count
Mt                 
s1  a      1      3
s2  c      3      5
s3  f      6      6

Update

Установите as_index=False для достижения своей цели

In [28]: df.groupby('Mt', as_index=False).first()
Out[28]: 
   Mt Sp  Value  count
0  s1  a      1      3
1  s2  c      3      5
2  s3  f      6      6 

Обновить снова

Извините за непонимание, что вы имеете в виду. Вы можете отсортировать его первым, если хотите, чтобы с максимальным счетом в группе

In [196]: df.sort('count', ascending=False).groupby('Mt', as_index=False).first()
Out[196]: 
   Mt Sp  Value  count
0  s1  a      1      3
1  s2  e      5     10
2  s3  f      6      6

Ответ 2

Чтобы получить первое появление максимального count, вы можете использовать pandas.DataFrame.idxmax():

>>> df.iloc[df.groupby(['Mt']).apply(lambda x: x['count'].idxmax())]
   Mt Sp  Value  count
0  s1  a      1      3
3  s2  d      4     10
5  s3  f      6      6

Ответ 3

Играя с ответом Романа Пекара, я обнаружил, что следующий код будет работать:

from math import isnan
df.iloc[[int(x) for x in df.groupby(by=df.Mt).apply(lambda x: x['count'].idxmax()).values if not isnan(y)]]

Обратите внимание на условие isnan, так как мое приложение имеет несколько записей в столбце, которые мы увеличиваем.