Groupbyしたgroupに関して条件抽出したい。
Pythonでgroupbyしたgroupの中から条件を満たすgroupの要素を全て取得する方法を解説する。
例えば、以下のデータがあり、最高スコアが80以上だった場合その人のデータを全て取得するということを目指すとする。
import pandas as pd
import numpy as np
df = pd.DataFrame({"name":["Yamada","Yamada","Yamada","Suzuki","Suzuki","Hayashi"],
"score":[60,70,80,60,70,80]})
print(df)
# name score
# 0 Yamada 60
# 1 Yamada 70
# 2 Yamada 80
# 3 Suzuki 60
# 4 Suzuki 70
# 5 Hayashi 80
(19/12/05修正)このような時はgroupby.filter
を用いると一行で書くことができる。
new_df = df.groupby('name').filter(lambda group: group['score'].max() >= 80)
print(new_df)
# name score
# 0 Yamada 60
# 1 Yamada 70
# 2 Yamada 80
# 5 Hayashi 80
filter()
の中身は条件に関するラムダ式となる。
ちなみに、私はQiitaで教えていただく前は以下のようにして、条件抽出を行なっていた。
groupbyをしたgroupごとに条件を満たすキーを取得して、そのキーに元々のデータフレームを左外部結合すれば良い。
具体的には、以下のコードとなる。
group_df = df.groupby('name').max().reset_index()
key = group_df[group_df['score'] >= 80]['name']
new_df = pd.merge(key, df, on = 'name', how = 'left')
print(new_df)
# name score
# 0 Hayashi 80
# 1 Yamada 60
# 2 Yamada 70
# 3 Yamada 80
条件を満たすキーを取り出し、そこからgroupbyの操作で消してしまったスコアの情報を復元するために、左外部結合をするという一連の流れが一行で書くことができるようになり感動しました。