Skip to content

Pandasデータフレームで単一の列に複数条件で該当した列を削除する

はじめに

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/