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
user | number | |
---|---|---|
0 | A | 1 |
1 | A | 2 |
2 | A | 1 |
3 | B | 2 |
4 | C | 3 |
5 | A | 1 |
6 | C | 1 |
このDataFrameから、例えば、各ユーザーのカウントが2個以上の項目だけgroupbyしたいという機会があった。 これは以下の様に、groupbyの後にfilterとlambdaを利用する事で実現できる。
df.groupby("user").filter(lambda x: x["number"].count() >= 2)
user | number | |
---|---|---|
0 | A | 1 |
1 | A | 2 |
2 | A | 1 |
4 | C | 3 |
5 | A | 1 |
6 | C | 1 |
要素の最大値が3以上のような形でフィルタリングすることも可能。
df.groupby("user").filter(lambda x: x["number"].max() >= 3)
user | number | |
---|---|---|
4 | C | 3 |
6 | C | 1 |
要素の最小値に関しても同様に実行できる。
df.groupby("user").filter(lambda x: x["number"].min() <= 1)
user | number | |
---|---|---|
0 | A | 1 |
1 | A | 2 |
2 | A | 1 |
4 | C | 3 |
5 | A | 1 |
6 | C | 1 |
今までは余計なDataFrameを作成していたので、今後はワンライナーで実行するようにする。