2017-01-05 4 views
2

행 쌍에 0이 아닌 변수의 개수가 필요합니다.파이썬에서 여러 행의 0이 아닌 값을 계산합니까?

필자는 여러 샘플링 지점에서 발견 된 종의 밀도를 나열하는 데이터 프레임을 가지고 있습니다. 각 샘플링 포인트 쌍에서 발견 된 종의 총 수를 알아야합니다. 쌍 (111,333)은 (3)의 전체를 반환해야하면서 쌍 (111,222)은 4 개의 반환해야하므로

>>> import pandas 
>>> df = pd.DataFrame({'ID':[111,222,333,444],'minnow':[1,3,5,4],'trout':[2,0,0,3],'bass':[0,1,3,0],'gar':[0,1,0,0]}) 
>>> df 
    ID bass gar minnow trout 
0 111  0 0  1  2 
1 222  1 1  3  0 
2 333  3 0  5  0 
3 444  0 0  4  3 

I는 ID 번호에 의해 행 페어링 것이다 : 여기 내 데이터의 일례이다. 각 행에 대해 0이 아닌 합계를 얻을 수 있다는 것을 알고 있지만, 각 쌍에 대해 합계를 더하면 일부 종의 수를 두 배로 계산합니다.

+1

원하는 데이터 세트를 게시 할 수 있습니까? – MaxU

+0

각 쌍의 출력은 반복 수식에 통합되므로 각 쌍마다 하나의 정수 변수를 얻은 다음 루프가 반복 될 때마다 다시 계산할 수 있습니다. 또는 한 번에 모든 쌍을 계산하고 출력을 데이터 프레임에 저장 한 다음 루프에서 계산을 위해 그 결과를 가져올 수 있습니다. –

답변

0

당신은 슬라이스와 NumPy와 여기 df.iloc

np.sum((df.iloc[[0, 1], 1:]!=0).any(axis=0)) 

이 사용 iloc을 할 수있는 [[0, 1, 1 :]는 비의 총 수를 계산하면 처음 두 행과 NumPy와 합이되어 준다 선택한 행에서 제로 쌍. df.iloc [[0, 1], 1 :]을 사용하여 모든 행 조합을 선택할 수 있습니다.

+0

이 작품! 나는 그것을 루프에 통합 할 수있을 것이다. 고맙습니다! –

+0

@ Theresa, 당신은 대답을 수락 할 수 :) – Vaishali

1

여기 NumPy와 가진 접근 방식 - paired 제로가 아닌 경우 두 그룹이 잇달아 발생, 당신이 할 수 있도록 행이 정렬하는 경우

In [35]: df 
Out[35]: 
    ID bass gar minnow trout 
0 111  0 0  1  2 
1 222  1 1  3  0 
2 333  3 0  5  0 
3 444  0 0  4  3 

In [36]: a = df.iloc[:,1:].values!=0 

In [37]: r,c = np.triu_indices(df.shape[0],1) 

In [38]: l = df.ID 

In [39]: pd.DataFrame(np.column_stack((l[r], l[c], (a[r] | a[c]).sum(1)))) 
Out[39]: 
    0 1 2 
0 111 222 4 
1 111 333 3 
2 111 444 2 
3 222 333 3 
4 222 444 4 
5 333 444 3 
+0

이것은 당신의 라인을 돌릴 때 나에게 에러가 발생한다. 72 : 트레이스 백 (가장 최근의 마지막 콜) : 파일 , 라인 1, pd.DataFrame (np.column_stack (l [r], l [ NameError : 'l'이름이 정의되어 있지 않습니다. –

+0

@TheresaBrown 죄송 합니다만,'l = df.ID'를 추가하는 것을 잊었습니다. 방금 편집했습니다. 확인 해봐. – Divakar

+0

1 = df.ID가 '리터럴에 할당 할 수 없습니다'라는 오류를 반환했지만 1을 d로 바꾸려고했지만 'int'객체에 '__getitem__'속성이 없습니다라는 오류가 발생합니다. –

0

import pandas as pd 
import numpy as np 

x = np.random.randint(0,2,(10,3)) 

df = pd.DataFrame(x) 

pair_a = df.loc[::2].reset_index(drop = True) 
pair_b = df.loc[1::2].reset_index(drop = True) 


paired = pd.concat([pair_a,pair_b],axis = 1) 

다음 찾기 .

관련 문제