2017-11-17 6 views
1

팬더 데이터 프레임을 하위 집합으로 만들고 해당 ID로 그룹화하려는 작업을 수행하지 못했습니다. 실제 데이터 세트에서 나는 'ID'와 '상태'예를 들어하위 집합 팬더 데이터 프레임 처음으로 조건이 충족 될 때까지

사이에 여러 열이 있습니다

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 

,536,913,632 @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()의 사용법을 두 번 설명 할 수 있습니까? 출력의 차이를 볼 수는 있지만 완전히 이해하지는 못합니다. –

+0

@DarenEiri MCVE에서 칭찬을해야합니다. '상태'는 '0 0 0 1 0 1'입니다. 처음 4 줄이 필요해, 그치? 첫 번째'cumsum '은'0 0 0 1 1 2'를 제공합니다. '> = 1' (또는'le (1)') 조건에 기초하여, 4를 원할 때 첫 번째 5 행을 줄 것이다. 두 번째'cumsum '은'0 0 0 1 2 4', 이제'le (1)'은 나에게 내가 원하는 처음 4 행만을 준다. –

+0

@COLDSPEED. 설명해 주셔서 감사합니다. 수많은 실패한 시도 중에'cumsum' 접근 방식을 사용했지만'le (1)'을 가진 두 번째'cumsum '이 차이를 만듭니다! –