这里提出了类似的问题: 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
>>>
您可以使用
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
设定
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
要获得第一次出现的最大值
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
已经给出的答案并没有清楚地表明什么是迄今为止最快的选择。
按您想要最大值的行进行排序,然后删除重复项(将行名称作为参数,以考虑评估重复项)
df.sort_values('count', ascending=False).drop_duplicates(['Mt'])
注意:是的,这个答案已经在问题的评论中给出,但很容易错过。而且速度将比 groupby 快 10 倍。
根据 Roman Pekar 的回答,我发现以下代码可以工作:
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 条件,因为我的应用程序在我们要最大化的列中有一些 nan 条目。