Извлечь строку с максимальным значением в группе 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
>>>
Ответы
Ответ 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, так как мое приложение имеет несколько записей в столбце, которые мы увеличиваем.