1. ホーム
  2. python

[解決済み] groupbyでグループ内の最大値を持つ行を取得する。

2022-03-15 12:44:07

質問

の最大値を持つpandasデータフレーム内のすべての行を見つけるにはどうすればよいですか? count カラムでグループ化した後 ['Sp','Mt'] 列ですか?

例1. でグループ化した以下のdataFrameを作成します。 ['Sp','Mt'] :

   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**
2  MM1  S3   cb     **5**
3  MM2  S3   mk     **8**
4  MM2  S4   bg     **10** 
8  MM4  S2   uyi    **7**

例2: でグループ化したこのデータフレームは ['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 が最大になるように、各グループで、例えば :

MM2  S4   bg     10
MM4  S2   cb     8
MM4  S2   uyi    8

解決方法は?

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

グループごとに複数の最大値がある場合、すべてが返されることに注意してください。

更新情報

これはOPが要求しているものであることを万歳のチャンスで。

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