8
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-05

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

8
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?