2017-11-24 2 views
1

으로 연속 진정한 값의 블록을 식별 그 잘 작동하고내가 부울 팬더 <code>DataFrame</code>이 허용

를 반환

N=3.0 
b = w.ne(w.shift()).cumsum() *w 
m = b[0].map(b[0].mask(b[0] == 0).value_counts()) >= N 

에 의해 (SO에 elsewere 제안)

m 
0  False 
1  False 
2  True 
3  True 
4  True 
5  False 
6  False 
7  False 
8  False 
9  False 
10 False 
11 False 
12 False 

이제 블록을 결정할 때 약간의 허용 오차를 허용해야합니다. 그래서 적어도 N 이상의 모든 블록을 식별하고 싶지만 M 값 (블록 내에 임의로 배치됨)이 False이되도록 허용하고 싶습니다. w 예를 들어

, N = 3, M = 1이 있어야

에서 이전 결과와 다르게
w 
0 True 
1 False 
2 True 
3 True 
4 True 
5 False 
6 False 
7 True 
8 False 
9 True 
10 True 
11 False 
12 True 

:

desidered= 
0 **True** 
1 **True** 
2 True 
3 True 
4 True 
5 False 
6 False 
7 True 
8 ** True ** 
9 True 
10 True 
11 **True** 
12 True 

답변

1

은 당신이 할 수 재사용 솔루션을 믿는다 or 의해 ~ 마지막 쇄 양쪽 조건 m 반전 :

N = 3.0 
M = 1 
b = w.ne(w.shift()).cumsum() *w 
m = b[0].map(b[0].mask(b[0] == 0).value_counts()) <= N 

w1 = ~m 
b1 = w1.ne(w1.shift()).cumsum() * w1 
m1 = b1.map(b1.mask(b1 == 0).value_counts()) == M 

m = m | m1 

print (m) 
0  True 
1  True 
2  True 
3  True 
4  True 
5  False 
6  False 
7  True 
8  True 
9  True 
10  True 
11  True 
12  True 
Name: 0, dtype: bool 
+1

보 올레 안 논리는 항상 가장 깨끗합니다. 대답은 정확합니다. 나중에 승인 할 것입니다. – ErroriSalvo

관련 문제