2017-11-17 9 views
1

私は、パンダのデータフレームを値にサブセット化し、そのIDでグループ分けしたいと思っています。私が持っている実際のデータセットたとえば 'ID' と '状態'サブセットpandasデータフレーム初めて条件が満たされたときまで

の間で複数の列で:

d = {'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2], 'status': [0,0,0,0,1,1,1,0,0,0,0,1,0,1]} 
df = pd.DataFrame(data=d) 

    id status 
0 1  0 
1 1  0 
2 1  0 
3 1  0 
4 1  1 
5 1  1 
6 1  1 
7 2  0 
8 2  0 
9 2  0 
10 2  0 
11 2  1 
12 2  0 
13 2  1 

希望サブセットは、次のようになります。

id status 
0 1  0 
1 1  0 
2 1  0 
3 1  0 
4 1  1 
5 2  0 
6 2  0 
7 2  0 
8 2  0 
9 2  1 

答えて

2

のはgroupby + cumsumを試してみましょう:

df = df.groupby('id', group_keys=False)\ 
     .apply(lambda x: x[x.status.cumsum().cumsum().le(1)])\ 
     .reset_index(drop=1) 
df 

    id status 
0 1  0 
1 1  0 
2 1  0 
3 1  0 
4 1  1 
5 2  0 
6 2  0 
7 2  0 
8 2  0 
9 2  1 

@COLDSPEED
df = df[df.status.eq(1).groupby(df.id)\ 
      .apply(lambda x: x.cumsum().cumsum().le(1))]\ 
      .reset_index(drop=1) 
df 

    id status 
0 1  0 
1 1  0 
2 1  0 
3 1  0 
4 1  1 
5 2  0 
6 2  0 
7 2  0 
8 2  0 
9 2  1 
+0

ありがとう:10

はここインデクサーとして使用するマスクを作成するためにgroupbyを行い、代替です。 .cumsum()。cumsum()の使用方法を2回説明できますか?私は出力の違いを見るが、完全に理解していない。 –

+0

@DarenEiri MCVEであなたを賞賛しなければならない。 「状態」は「0 0 0 1 0 1」とする。最初の4行は必要ですか?最初の 'cumsum'は' 0 0 0 1 1 2'を与えます。 '> = 1'(または' le(1) ')の条件に基づいて、私は4を求めている間に最初の5行を与えます。2番目の' cumsum'は '0 0 0 1 2 4'、今では 'le(1)'は私に必要な最初の4行だけを与えてくれます。 –

+0

@COLDSPEED。ご説明をいただき、ありがとうございます。私は数多く失敗した試みの中で 'cumsum'アプローチを使っていましたが、' le(1) 'の2番目の' cumsum'が違いになりました! –

関連する問題