70126


Pandasで以下のdfを処理しようとしています。A列（ID）が同じデータのうち、E列において、後ろに0がない1の値が不要であり、削除したいです。つまり、13、14行目はA列（ID）が3であり、ID＝3において後ろにE列の値に0がないので削除したいです。（21行目のID＝5においても同様）  
初心者にもわかりやすい方法があればご教示いただけますでしょうか。

[code]

        A   B   C   D   E   F
    1   1   0   0   0   1   116
    2   1   0.8 0.8 2.2 0   0
    3   1   0.2 0.2 4.4 0   0
    4   1   0.8 0.4 0.4 0   0
    5   1   0.5 0.7 3.8 0   0
    6   2   1   1   8.9 1   116
    7   2   1.5 1.5 1.7 0   0
    8   2   2   2   8.7 0   0
    9   3   3   3   5.  0   0
    10  3   4.5 4.5 2.2 1   116
    11  3   6.0 6.5 0.8 0   0
    12  3   8   8   0.3 0   0
    13  3   5.3 0   0   1   116   #IDが3、E列の値が1で後ろにE列0がないので削除
    14  3   0   0   0   1   116 　#IDが3、E列の値が1で後ろにE列0がないので削除
    15  4   0.8 0.8 1.1 1   116
    16  4   0.2 0.5 3.4 0   0
    17  4   0.4 0.8 3.2 1   116   #IDが4、E列の値が1だが、後ろの18行目はIDが4、E列1なので削除しない
    18  4   0.7 0.5 3.0 0   0
    19  5   1   1   1.5 1   116
    20  5   1.5 1.5 1.7 0   0
    21  5   2   2   7.9 1   116   #IDが5、E列の値が1で後ろにE列0がないので削除
    22  6   2   2   7.9 1   116
    ・
    ・
    ・
    
[/code]

以下が目標とするdfです。

[code]

        A   B   C   D   E   F
    1   1   0   0   0   1   116
    2   1   0.8 0.8 2.2 0   0
    3   1   0.2 0.2 4.4 0   0
    4   1   0.8 0.4 0.4 0   0
    5   1   0.5 0.7 3.8 0   0
    6   2   1   1   8.9 1   116
    7   2   1.5 1.5 1.7 0   0
    8   2   2   2   8.7 0   0
    9   3   3   3   5.  0   0
    10  3   4.5 4.5 2.2 1   116
    11  3   6.0 6.5 0.8 0   0
    12  3   8   8   0.3 0   0
    13  4   0.8 0.8 1.1 1   116
    14  4   0.2 0.5 3.4 0   0
    15  4   0.4 0.8 3.2 1   116
    16  4   0.7 0.5 3.0 0   0
    17  5   1   1   1.5 1   116
    18  5   1.5 1.5 1.7 0   0
    19  6   2   2   7.9 1   116
    ・
    ・
    ・
    
[/code]


CC BY-SA 4.0
2020-09-04T03:20:50.743
70121
2020-09-04T11:13:32.230
2020-09-04T04:40:06.593
41680
41680
question
python pandas
Pandasにおいて、IDでグループ化してからデータ削除を行いたい


前回同様、元のデータが`df`に入っている、かつ23行目に`23 6 2 2 7.9 0
0`のデータがあるとして、以下のように出来るでしょう。(追記：インデックスの扱いを修正)

[code]

    df.index -= 1  ## いったんインデックスを0オリジンに設定しておく
    droprows = []
    grouped = df.groupby('A')
    for i, dfw in grouped:
        rindex = sorted(dfw.index, reverse=True) ## グループ毎のインデックスを降順でソート
        for j in rindex:
            if df.iloc[j, 4] == 1:  ## 元のdfからデータ取得して'E'が1なら削除リストに追加
                droprows.append(j)
            else:                   ## 'E'が0ならこのグループの処理を終了して次のグループへ
                break
    
    droprows.sort() ## 削除リストを昇順でソートしておく
    
    df.drop(index=droprows, inplace=True)
    df.reset_index(drop=True, inplace=True)
    df.index += 1  ## インデックスを1オリジンに戻す
    
[/code]


CC BY-SA 4.0
2020-09-04T05:14:34.547
70126
2020-09-04T11:13:32.230
2020-09-04T11:13:32.230
26370
26370
70121
answer