はじめに
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/