Skip to content

Pandasデータフレームで複数の特定の値を複数の列に含んだ行を削除する

はじめに

Pandasデータフレームで複数の特定の値を複数の列に含んだ行を削除して、残った行のみの新たなデータフレームを作成します。


やりたいこと

  • 以下のような表がある場合に、「出欠」の列の値が「欠席」なっている、かつ「合否」の列の値が「合格」になっている「Dさん」の行を削除します。

  • 削除する行は、「欠席」かつ「合格」の値が入っているand条件です。
    (or条件で行を削除する場合は、特定の値を含んだ行を繰り返し削除することで対処できますので、こちらの記事の関数をご参考ください。)

    <削除前>

    <削除後>


実装ポイント

  • 「欠席」かつ「合格」の値が入っているインデックスを取得して、取得したインデックスを基に行を削除します。


コード例

import pandas as pd

# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(r"ファイルパス" ) 

# 複数のand条件にマッチしたIndexを取得
drop_index = df.index[(df['出欠'] == '欠席') & (df['合否'] == '合格')]

# and条件にマッチしたIndexを削除
df_sakuzyo_go = df.drop(drop_index)

print(df_sakuzyo_go)

    氏名  出席番号  数学(点)  英語(点)  理科(点)  社会(点)  国語(点)   出欠   合否
0  Aさん     1     80     77     90     90     80  NaN  不合格
1  Bさん     2     90     95     80     90     82   欠席  NaN
2  Cさん     3     77     95     90     80     92  NaN  NaN
4  Eさん     5     80     70     95     92     82  NaN   合格


コード詳細

途中の状態を出力してみると、以下のようになっています。

import pandas as pd

# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(r"ファイルパス" ) 

#複数の条件にマッチしたIndexを取得
drop_index = df.index[(df['出欠'] == '欠席') & (df['合否'] == '合格')]

print((df['出欠'] == '欠席') & (df['合否'] == '合格'))
0    False
1    False
2    False
3     True
4    False
dtype: bool

print(df.index[(df['出欠'] == '欠席') & (df['合否'] == '合格')])
Int64Index([3], dtype='int64')


補足

  • 行を削除すると、削除した行のインデックス番号もそのまま削除されます。
    その為、下記コードのようにインデックス番号が「0, 1, 2, 4」となり番号がずれますので、行削除後はインデックス番号の振り直しを行うとよいでしょう。

    print(df_sakuzyo_go)
    
    氏名  出席番号  数学(点)  英語(点)  理科(点)  社会(点)  国語(点)   出欠   合否
    0  Aさん     1     80     77     90     90     80  NaN  不合格
    1  Bさん     2     90     95     80     90     82   欠席  NaN
    2  Cさん     3     77     95     90     80     92  NaN  NaN
    4  Eさん     5     80     70     95     92     82  NaN   合格


参考

https://thispointer.com/python-pandas-how-to-drop-rows-in-dataframe-by-conditions-on-column-values/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA