2017-10-02 7 views
0

내 상황 : 각 행에 대해 다음을 계산해야하므로 판다 데이터 프레임이 있습니다.NA 및 카운트 값을 제거하는 방법 벡터화 된 방식으로 numpy로 NxK 배열

1) 위젯 제 valute na 제외 (df.apply(lambda x: x.dropna().iloc[0]))

2) 마지막 valute na 제외 (df.apply(lambda x: x.dropna().iloc[-1]))

3) 비 na 카운트 값 (df.apply(lambda x: len(x.dropna()))

샘플 케이스 얻기 예상 출력 :

x = np.array([[1,2,np.nan], [4,5,6], [np.nan, 8,9]]) 
1) [1, 4, 8] 
2) [2, 6, 9] 
3) [2, 3, 2] 

그리고 최적화 된 상태로 유지해야합니다. 그래서 나는 numpy으로 방향을 바꾸어 첫 번째 단계로 NxK 배열에 y = x[~numpy.isnan(x)]을 적용 할 방법을 찾았습니다. 그 후, 나는 1 여기 (Vectorized way of accessing row specific elements in a numpy array)을 참조)과 2 무슨 사용한다)하지만 난 여전히

+0

사례를 삽화를 작성 하시겠습니까? – Divakar

+0

테스트 케이스를 추가했습니다. – Asher11

+0

수집 한 샘플을 볼 때 열 대신 행으로 편집되었습니다. 필요한 경우 언제든지 편집/롤백 할 수 있습니다. – Divakar

답변

1

여기 하나의 방법) 3 빈 손입니다 - 우리는 cumulative-summation의 사용을 만들 수있는, 또는

In [756]: x 
Out[756]: 
array([[ 1., 2., nan], 
     [ 4., 5., 6.], 
     [ nan, 8., 9.]]) 

In [768]: m = ~np.isnan(x) 

In [769]: first_idx = m.argmax(1) 

In [770]: last_idx = m.shape[1] - m[:,::-1].argmax(1) - 1 

In [771]: x[np.arange(len(first_idx)), first_idx] 
Out[771]: array([ 1., 4., 8.]) 

In [772]: x[np.arange(len(last_idx)), last_idx] 
Out[772]: array([ 2., 6., 9.]) 

In [773]: m.sum(1) 
Out[773]: array([2, 3, 2]) 

그러한 지표를 얻으려면

In [787]: c = m.cumsum(1) 

In [788]: first_idx = (c==1).argmax(1) 

In [789]: last_idx = c.argmax(1) 
+0

감사! 이 주제에 관해서는 언제나 최고입니다. – Asher11