猿问

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

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

我希望我能为我的问题找到帮助。我正在寻找解决以下问题的方法:


我有一个数据框架,就像:


 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**

我的目标是得到组间计数最大的结果行,如下所示:


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  count

4  MM2  S4   bg     10

5  MM2  S4   dgd    1

6  MM4  S2   rd     2

7  MM4  S2   cb     8

8  MM4  S2   uyi    8

对于上面的示例,我希望得到每个组中Count等于max的所有行,例如:


MM2  S4   bg     10

MM4  S2   cb     8

MM4  S2   uyi    8


富国沪深
浏览 2452回答 3
3回答

尚方宝剑之说

In [1]: dfOut[1]:    Sp  Mt Value  count0  MM1  S1     a      31  MM1  S1     n      22  MM1  S3    cb      53  MM2  S3    mk      84  MM2  S4    bg     105  MM2  S4   dgd      16  MM4  S2    rd      27  MM4  S2    cb      28  MM4  S2   uyi      7In [2]: df.groupby(['Mt'], sort=False)['count'].max()Out[2]:MtS1     3S3     8S4    10S2     7Name: count要获得原始DF的索引,可以这样做:In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']In [4]: df[idx]Out[4]:    Sp  Mt Value  count0  MM1  S1     a      33  MM2  S3    mk      84  MM2  S4    bg     108  MM4  S2   uyi      7注意,如果每个组有多个最大值,则将返回所有值。更新玛丽有机会说这是行动小组的要求:In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)In [6]: dfOut[6]:    Sp  Mt Value  count  count_max0  MM1  S1     a      3          31  MM1  S1     n      2          32  MM1  S3    cb      5          83  MM2  S3    mk      8          84  MM2  S4    bg     10         105  MM2  S4   dgd      1         106  MM4  S2    rd      2          77  MM4  S2    cb      2          78  MM4  S2   uyi      7          7

缥缈止盈

简单的解决办法是:函数获取具有最大值的行的索引。这将筛选出组中具有最大值的所有行。In [365]: import pandas as pdIn [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  val0      3  S1  MM1    a1      2  S1  MM1    n2      5  S3  MM1   cb3      8  S3  MM2   mk4     10  S4  MM2   bg5      1  S4  MM2  dgb6      2  S2  MM4   rd7      2  S2  MM4   cb8      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  val0      3  S1  MM1    a2      5  S3  MM1   cb3      8  S3  MM2   mk4     10  S4  MM2   bg8      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])
随时随地看视频慕课网APP

相关分类

Python
我要回答