在组pandas数据帧中提取具有最大值的行

时间:2013-11-06 17:30:08

标签: python pandas

这里提出类似的问题: Python : Getting the Row which has the max value in groups using 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
>>> 

3 个答案:

答案 0 :(得分:28)

您可以使用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

答案 1 :(得分:19)

要首次出现最大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

答案 2 :(得分:0)

借用罗马佩卡尔的答案,我发现以下代码可以正常工作:

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条目。