2013-10-25 1 views
2

필자는 동등해야한다고 생각하는 팬더 코드 두 조각을 가지고 있지만 두 번째 코드는 예상 한대로 수행하지 않습니다.팬더 데이터 프레임을 구축 할 때 논리 연산자 사용

# snippet 1 
    data = all_data[[((np.isfinite(all_data[self.design_metric][i]) 
        and all_data['Source'][i] == 2)) 
        or ((np.isfinite(all_data[self.actual_metric][i]) 
        and all_data['Source'][i] != 2)) 
        for i in range(len(all_data))]] 


# snippet 2 
    data = all_data[(all_data['Source'] == 2 & 
        np.isfinite(all_data[self.design_metric])) | 
        (all_data['Source'] != 2 & 
        np.isfinite(all_data[self.actual_metric]))] 

각 섹션 (예 : all_data['Source'] == 2) 내가 스스로 기대하지하지만리스트 통합 버전으로 다른 결과로 나오고 내가 최종 결과와 논리 연산자에 뭔가를하고 있어요 보인다 .

답변

8

& 연산자는 == (또는 비교 연산자)보다 긴밀하게 바인딩됩니다. the documentation을 참조하십시오. 더 간단한 예는 다음과 같습니다가 2 == (2 & 3) == 3로 그룹화하고 비교 체인이 호출되기 때문에

>>> 2 == 2 & 3 == 3 
False 

이입니다. 이것은 귀하의 경우에 일어나는 일입니다. 각 비교를 괄호로 묶어야합니다.

data = all_data[((all_data['Source'] == 2) & 
       np.isfinite(all_data[self.design_metric])) | 
       ((all_data['Source'] != 2) & 
       np.isfinite(all_data[self.actual_metric]))] 

참고 ==!= 비교 주위에 여분의 괄호.

1

우선 순위와 함께 AND와 & 연산자 사이에는 차이가 있습니다. 첫 번째는 부울이고 후자는 이진 비트입니다. 또한, 당신은 boolead 표현을 알고 있어야합니다.

다음 코드에서 예를 참조하십시오 :

논리적 표현

>>> 1 and 2 
1 

>>> '1' and '2' 
'1' 

>>> 0 == 1 and 2 == 0 or 0 
0 

비트 연산자

>>> 1 & 2 
0 

>>> '1' & '2' 
Traceback (most recent call last): 
    ... 
TypeError: unsupported operand type(s) for &: 'str' and 'str' 

>>> 0 == 1 & 2 == 0 | 0 
True