2016-07-29 7 views
2

다음과 같은 데이터 프레임이 있으며 클래스 블록에 기반하여 얼마나 많은 유사한 블록이 표시되었는지를 기준으로 전체 블록에 레이블을 붙이려고합니다. 연속적인 클래스 값에 동일한 숫자가 지정됩니다. 같은 클래스 블록이 나중에 나오면 숫자가 증가합니다. 새로운 클래스 블록이 생기면 1으로 초기화됩니다.팬더에 반복 된 블록 계산하기

df = DataFrame(zip(range(10,30), range(20)), columns = ['a','b']) 
df['Class'] = [np.nan, np.nan, np.nan, np.nan, 'a', 'a', 'a', 'a', np.nan, np.nan,'a', 'a', 'a', 'a', 'a', np.nan, np.nan, 'b', 'b','b'] 

    a b Class 
0 10 0 NaN 
1 11 1 NaN 
2 12 2 NaN 
3 13 3 NaN 
4 14 4  a 
5 15 5  a 
6 16 6  a 
7 17 7  a 
8 18 8 NaN 
9 19 9 NaN 
10 20 10  a 
11 21 11  a 
12 22 12  a 
13 23 13  a 
14 24 14  a 
15 25 15 NaN 
16 26 16 NaN 
17 27 17  b 
18 28 18  b 
19 29 19  b 

샘플 출력은 다음과 같습니다

a b Class block_encounter_no 
0 10 0 NaN NaN 
1 11 1 NaN NaN 
2 12 2 NaN NaN 
3 13 3 NaN NaN 
4 14 4 a 1 
5 15 5 a 1 
6 16 6 a 1 
7 17 7 a 1 
8 18 8 NaN NaN 
9 19 9 NaN NaN 
10 20 10 a 2 
11 21 11 a 2 
12 22 12 a 2 
13 23 13 a 2 
14 24 14 a 2 
15 25 15 NaN NaN 
16 26 16 NaN NaN 
17 27 17 b 1 
18 28 18 b 1 
19 29 19 b 1 

답변

2

솔루션 mask로 :

df['block_encounter_no'] = (df.Class != df.Class.shift()).mask(df.Class.isnull()) 
           .groupby(df.Class).cumsum() 
print (df) 
    a b Class block_encounter_no 
0 10 0 NaN     NaN 
1 11 1 NaN     NaN 
2 12 2 NaN     NaN 
3 13 3 NaN     NaN 
4 14 4  a     1.0 
5 15 5  a     1.0 
6 16 6  a     1.0 
7 17 7  a     1.0 
8 18 8 NaN     NaN 
9 19 9 NaN     NaN 
10 20 10  a     2.0 
11 21 11  a     2.0 
12 22 12  a     2.0 
13 23 13  a     2.0 
14 24 14  a     2.0 
15 25 15 NaN     NaN 
16 26 16 NaN     NaN 
17 27 17  b     1.0 
18 28 18  b     1.0 
19 29 19  b     1.0 
+0

. 그러나 마지막 블록은 'b' 블록이 새로운 클래스이므로 1부터 시작해야합니다. – learner

+0

죄송합니다. 이제 답을 수정합니다 - groupby를'Class'로 추가하면 해결할 수 있습니다. – jezrael

0

이 작업을 수행 :

df['block_encounter_no'] = \ 
    np.where(df.Class.notnull(), 
      (df.Class.notnull() & (df.Class != df.Class.shift())).cumsum(), 
      np.nan) 

enter image description here

+0

감사합니다. 그러나 마지막 블록은 'b' 블록이 새로운 클래스이므로 1부터 시작해야합니다. 감사합니다. – learner