はじめに
Pandasデータフレームで単一の列に対して、複数条件で該当した値を持つ行を削除します。
やりたいこと
-
以下のような表がある場合に、「国語(点)」の列の値が「80」点以上、あるいは「85」点以下になっている行を削除します。
<削除前>
<削除後>
実装ポイント
- 「国語(点)」の列の値が「80」点以上、あるいは「85」点以下になっている行のインデックスを取得して、取得したインデックスを基に行を削除します。
コード例
import pandas as pd
# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(r"ファイルパス" )
#複数の条件にマッチしたIndexを取得
drop_index = df.index[(df['国語(点)'] >= 80) & (df['国語(点)'] <= 85)]
#条件にマッチしたIndexを削除
df_sakuzyo_go = df.drop(drop_index)
print(df_sakuzyo_go)
氏名 出席番号 数学(点) 英語(点) 理科(点) 社会(点) 国語(点)
2 Cさん 3 77 95 90 80 92
3 Dさん 4 99 100 94 98 95
コード詳細
途中の状態を出力してみると、以下のようになっています。
import pandas as pd
# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(r"ファイルパス" )
#複数の条件にマッチしたIndexを取得
drop_index = df.index[(df['国語(点)'] >= 80) & (df['国語(点)'] <= 85)]
print((df['国語(点)'] >= 80) & (df['国語(点)'] <= 85))
0 True
1 True
2 False
3 False
4 True
Name: 国語(点), dtype: bool
print(df.index[(df['国語(点)'] >= 80) & (df['国語(点)'] <= 85)])
Int64Index([0, 1, 4], dtype='int64')
補足
-
行を削除すると、削除した行のインデックス番号もそのまま削除されます。
その為、下記コードのようにインデックス番号が「2, 3」となり番号がずれますので、行削除後はインデックス番号の振り直しを行うとよいでしょう。print(df_sakuzyo_go) 氏名 出席番号 数学(点) 英語(点) 理科(点) 社会(点) 国語(点) 2 Cさん 3 77 95 90 80 92 3 Dさん 4 99 100 94 98 95
参考
https://thispointer.com/python-pandas-how-to-drop-rows-in-dataframe-by-conditions-on-column-values/