複数のカラムにまたがった条件を満たした行をデータフレームから除去する方法。パッと思いつかなかったのでメモしておく。
シンプルな方法
import pandas as pd
df = pd.DataFrame({'ID': [1, 2, 3, 3, 4, 5, 5],
'Name': ['Noto', 'Hisakawa', 'Kouda', 'Hayashibara', 'sakamoto', 'tamura', 'mitsuishi'],
'score':[100, 50, 80, 50, 100, 70, 55]})
df
ID Name score
0 1 Noto 100
1 2 Hisakawa 50
2 3 Kouda 80
3 3 Hayashibara 50
4 4 sakamoto 100
5 5 tamura 70
6 5 mitsuishi 55
ひと手間かかるが、複数条件に合致する行のインデックスを定義してdrop関数に渡す。
まずは条件を作って、インデックスを取得する。複数条件はandの場合は&を使って条件を追加していく。orなら|。
target = df.index[(df['ID'] > 3) & (df['score'] > 60)]
target
Int64Index([4, 5], dtype='int64')
あとはdrop関数を使ってデータフレームから対象データを除去する。
df.drop(target)
ID Name score
0 1 Noto 100
1 2 Hisakawa 50
2 3 Kouda 80
3 3 Hayashibara 50
6 5 mitsuishi 55
対象が除去された。この際、インデックスも除去されている(飛び飛びになっている)ので必要があればインデックスを振り直す。
queryメソッドを使用した場合
対象になる列のインデックスを取得する際に、queryメソッドを使ってシンプルに抽出することができた。いちいちdf[‘column’]と記述しないでいいので読みやすく分かりやすい。https://note.nkmk.me/python-pandas-query/
df.query('ID > 3 & score > 60').index
Int64Index([4, 5], dtype='int64')
今後はこちらを使うことにする。