为了账号安全,请及时绑定邮箱和手机立即绑定

Python:使用groupby获取在组中具有最大值的行

Python:使用groupby获取在组中具有最大值的行

富国沪深 2019-06-05 11:18:31
Python:使用groupby获取在组中具有最大值的行我希望我能为我的问题找到帮助。我正在寻找解决以下问题的方法:我有一个数据框架,就像: Sp  Mt Value  count0  MM1  S1   a      **3**1  MM1  S1   n      22  MM1  S3   cb     53  MM2  S3   mk      **8**4  MM2  S4   bg     **10**5  MM2  S4   dgd      16  MM4  S2  rd     27  MM4  S2   cb      28  MM4  S2   uyi      **7**我的目标是得到组间计数最大的结果行,如下所示:0  MM1  S1   a      **3**1 3  MM2  S3   mk      **8**4  MM2  S4   bg     **10** 8  MM4  S2   uyi      **7**有人知道我怎么能在熊猫或蟒蛇身上做到这一点?更新对于我的问题,我没有给出更多的细节。对于我的问题,我想分组[‘Sp’,‘mt’]。让我们举第二个例子,如下所示:   Sp   Mt   Value  count4  MM2  S4   bg     105  MM2  S4   dgd    16  MM4  S2   rd     27  MM4  S2   cb     88  MM4  S2   uyi    8对于上面的示例,我希望得到每个组中Count等于max的所有行,例如:MM2  S4   bg     10MM4  S2   cb     8MM4  S2   uyi    8
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

In [1]: df

Out[1]:

    Sp  Mt Value  count

0  MM1  S1     a      3

1  MM1  S1     n      2

2  MM1  S3    cb      5

3  MM2  S3    mk      8

4  MM2  S4    bg     10

5  MM2  S4   dgd      1

6  MM4  S2    rd      2

7  MM4  S2    cb      2

8  MM4  S2   uyi      7


In [2]: df.groupby(['Mt'], sort=False)['count'].max()

Out[2]:

Mt

S1     3

S3     8

S4    10

S2     7

Name: count

要获得原始DF的索引,可以这样做:


In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']


In [4]: df[idx]

Out[4]:

    Sp  Mt Value  count

0  MM1  S1     a      3

3  MM2  S3    mk      8

4  MM2  S4    bg     10

8  MM4  S2   uyi      7

注意,如果每个组有多个最大值,则将返回所有值。


更新


玛丽有机会说这是行动小组的要求:


In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)


In [6]: df

Out[6]:

    Sp  Mt Value  count  count_max

0  MM1  S1     a      3          3

1  MM1  S1     n      2          3

2  MM1  S3    cb      5          8

3  MM2  S3    mk      8          8

4  MM2  S4    bg     10         10

5  MM2  S4   dgd      1         10

6  MM4  S2    rd      2          7

7  MM4  S2    cb      2          7

8  MM4  S2   uyi      7          7


查看完整回答
反对 回复 2019-06-05
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

简单的解决办法是:函数获取具有最大值的行的索引。这将筛选出组中具有最大值的所有行。


In [365]: import pandas as pd


In [366]: df = pd.DataFrame({

'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],

'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],

'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],

'count' : [3,2,5,8,10,1,2,2,7]

})


In [367]: df                                                                                                       

Out[367]: 

   count  mt   sp  val

0      3  S1  MM1    a

1      2  S1  MM1    n

2      5  S3  MM1   cb

3      8  S3  MM2   mk

4     10  S4  MM2   bg

5      1  S4  MM2  dgb

6      2  S2  MM4   rd

7      2  S2  MM4   cb

8      7  S2  MM4  uyi



### Apply idxmax() and use .loc() on dataframe to filter the rows with max values:

In [368]: df.loc[df.groupby(["sp", "mt"])["count"].idxmax()]                                                       

Out[368]: 

   count  mt   sp  val

0      3  S1  MM1    a

2      5  S3  MM1   cb

3      8  S3  MM2   mk

4     10  S4  MM2   bg

8      7  S2  MM4  uyi


### Just to show what values are returned by .idxmax() above:

In [369]: df.groupby(["sp", "mt"])["count"].idxmax().values                                                        

Out[369]: array([0, 2, 3, 4, 8])


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 2451 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信