2017-09-06 9 views
2

私DATAFRAMEのための1つの列の値の最初の発生後:パンダ:ドロップ行私はこのようなルックスと連携各ID

ID Alarm 
1 1 
1 2 
1 3 
2 3 
2 1 
2 2 
2 4 
3 4 
3 2 

私が最初に出現した後、個別に各IDのすべての行を削除したいですしたがって、出力は次のようになります。

ID Alarm 
1 1 
1 2 
2 3 
2 1 
2 2 
3 4 
3 2 

最も簡単な方法は何ですか?おそらく、この場合のパンダの方法は存在するでしょうか?私はlocdf.loc[: df[(df['Alarm'] == 2)].index[0], :])で何かを作ってみましたが、IDとは無関係に、最初のアラーム= 2発生後のすべての行を削除します。

答えて

2

boolean indexingmaskは、カスタム機能付きで作成することができます。groupby

最初に2を含む必要があるため、各グループについて最初にshiftの値を比較してください。次に2eqを比較してください。しかし、グループごとに2の複数の値を一致させる必要があるので、cumsumが必要であり、0Falseの行が削除されている必要があります。

df = df[df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum().eq(0))] 
print (df) 
    ID Alarm 
0 1  1 
1 1  2 
3 2  3 
4 2  1 
5 2  2 
7 3  4 
8 3  2 

より多くのデータをよりよく理解するために:

df['a'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift()) 
df['b'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2)) 
df['c'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum()) 
df['d'] = df.groupby('ID')['Alarm'].apply(lambda x: x.shift().eq(2).cumsum().eq(0)) 
print (df) 
    ID Alarm a  b c  d 
0 1  1 NaN False 0 True 
1 1  2 1.0 False 0 True 
2 1  2 2.0 True 1 False 
3 1  2 2.0 True 2 False 
4 1  3 2.0 True 3 False 
5 2  3 NaN False 0 True 
6 2  1 3.0 False 0 True 
7 2  2 1.0 False 0 True 
8 2  4 2.0 True 1 False 
9 3  4 NaN False 0 True 
10 3  2 4.0 False 0 True 
+0

jezraelが-ことができますあなたは素晴らしいhelp.Thanksだろういくつかのlines.Thatで上記のコードを詳しく説明してください@。 – Satya

+0

@Satya - 時間をください。 – jezrael

+1

@Satya - 編集を確認してください。 – jezrael

関連する問題