pandasでgroupby後にfilterをかける

pandas利用中にgroupby後にある条件を適用したい場面に遭遇した。 調べてみると、groupby.filter(lambda x: x)でfilter関数を適用できる事がわかった。

github

  • githubのjupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

実行環境

!sw_vers
ProductName:		macOS
ProductVersion:		13.5.1
BuildVersion:		22G90
!python -V
Python 3.11.4

適当なDataFrameを作成

import pandas as pd

df = pd.DataFrame(
    {
        "user": ["A", "A", "A", "B", "C", "A", "C"],
        "number": [1, 2, 1, 2, 3, 1, 1],
    }
)

df
usernumber
0A1
1A2
2A1
3B2
4C3
5A1
6C1

このDataFrameから、例えば、各ユーザーのカウントが2個以上の項目だけgroupbyしたいという機会があった。 これは以下の様に、groupbyの後にfilterとlambdaを利用する事で実現できる。

df.groupby("user").filter(lambda x: x["number"].count() >= 2)
usernumber
0A1
1A2
2A1
4C3
5A1
6C1

要素の最大値が3以上のような形でフィルタリングすることも可能。

df.groupby("user").filter(lambda x: x["number"].max() >= 3)
usernumber
4C3
6C1

要素の最小値に関しても同様に実行できる。

df.groupby("user").filter(lambda x: x["number"].min() <= 1)
usernumber
0A1
1A2
2A1
4C3
5A1
6C1

今までは余計なDataFrameを作成していたので、今後はワンライナーで実行するようにする。