2017-04-20 5 views
1

각 항목이를 나타냅니다 내가 같은 형태의 새로운 DataFrame을 원하는빠른 방법은 DataFrame의 마지막 유효 값에서 계산 열

A  B  
0 0.1880 0.345 
1 0.2510 0.585 
2 NaN  NaN 
3 NaN  NaN 
4 NaN  1.150 
5 0.2300 1.210 
6 0.1670 1.290 
7 0.0835 1.400 
8 0.0418 NaN  
9 0.0209 NaN  
10 NaN  NaN  
11 NaN  NaN  
12 NaN  NaN  

같은 DataFrame이 말에 NaN이 수를 얻을 수

이 팬더/NumPy와 기능의 일부를 활용하여 효율적으로 수행 할 수 있습니다 궁금
A  B  
0 0  0  
1 0  0 
2 1  1 
3 2  2 
4 3  0 
5 0  0 
6 0  0 
7 0  0 
8 0  1  
9 0  2 
10 1  3 
11 2  4 
12 3  5  

을 다음과 같이 위치가 마지막 유효 값에서 시작에 NaN을의 수를 카운트 업?

+0

당신이 뭔가를 시도 했습니까? – Dadep

+0

@Dadep 이중 루프로만 할 수 있으며, 충분히 빠르다고 생각하지 않습니다. – wh408

+0

몇 개의 컬럼이 있습니까? 일반적으로 얼마나 많은 행이 있습니까? – Divakar

답변

2

당신은 사용할 수 있습니다

a = df.isnull() 
b = a.cumsum() 
df1 = b.sub(b.mask(a).ffill().fillna(0).astype(int)) 
print (df1) 
    A B 
0 0 0 
1 0 0 
2 1 1 
3 2 2 
4 3 0 
5 0 0 
6 0 0 
7 0 0 
8 0 1 
9 0 2 
10 1 3 
11 2 4 
12 3 5 

더 나은 이해를 위해 :

#add NaN where True in a 
a2 = b.mask(a) 
#forward filling NaN 
a3 = b.mask(a).ffill() 
#replace NaN to 0, cast to int 
a4 = b.mask(a).ffill().fillna(0).astype(int) 
#substract b to a4 
a5 = b.sub(b.mask(a).ffill().fillna(0).astype(int)) 
df1 = pd.concat([a,b,a2, a3, a4, a5], axis=1, 
       keys=['a','b','where','ffill nan','substract','output']) 
print (df1) 
     a   b where  ffill nan  substract output 
     A  B A B  A B   A B   A B  A B 
0 False False 0 0 0.0 0.0  0.0 0.0   0 0  0 0 
1 False False 0 0 0.0 0.0  0.0 0.0   0 0  0 0 
2 True True 1 1 NaN NaN  0.0 0.0   0 0  1 1 
3 True True 2 2 NaN NaN  0.0 0.0   0 0  2 2 
4 True False 3 2 NaN 2.0  0.0 2.0   0 2  3 0 
5 False False 3 2 3.0 2.0  3.0 2.0   3 2  0 0 
6 False False 3 2 3.0 2.0  3.0 2.0   3 2  0 0 
7 False False 3 2 3.0 2.0  3.0 2.0   3 2  0 0 
8 False True 3 3 3.0 NaN  3.0 2.0   3 2  0 1 
9 False True 3 4 3.0 NaN  3.0 2.0   3 2  0 2 
10 True True 4 5 NaN NaN  3.0 2.0   3 2  1 3 
11 True True 5 6 NaN NaN  3.0 2.0   3 2  2 4 
12 True True 6 7 NaN NaN  3.0 2.0   3 2  3 5