Help us understand the problem. What is going on with this article?

GroupbyしたGroupに関して条件抽出(条件を満たすGroupの要素を全て取得)する方法

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の操作で消してしまったスコアの情報を復元するために、左外部結合をするという一連の流れが一行で書くことができるようになり感動しました。

Settin
フィッシャーが好きです。仕事場では、でーたさいえんてぃすとと呼ばれているようです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away