2014-09-17 8 views
1

EDIT : 테이블의 고정 값. 나는 논리적 OR 조건에 도스의를 수행하려고 그래서 지금팬더 부울 DataFrame 선택 모호성

>>>df[df > 0.5] 
      a   b   c 
0  NaN  NaN  Nan 
1 1.130206 0.899758  NaN 
2 1.390528  NaN  NaN 
3  NaN  NaN  NaN 
4 1.401183  NaN  NaN 
5  NaN 1.142039  NaN 

>>>df[df < 0] 
      a   b   c 
0  NaN  NaN -0.891527 
1  NaN  NaN -0.276587 
2  NaN -1.472802  NaN 
3  NaN -0.931329  NaN 
4  NaN -0.162357 -0.959156 
5 -0.127765  NaN -0.734434 

: 좀 부울 인덱싱을 수행하려고 그래서 지금

>>>df 
        a   b   c 
     0 0.016367 0.289944 -0.891527 
     1 1.130206 0.899758 -0.276587 
     2 1.390528 -1.472802 0.128979 
     3 0.023598 -0.931329 0.158143 
     4 1.401183 -0.162357 -0.959156 
     5 -0.127765 1.142039 -0.734434 

:

의가 나는 팬더 dataframe 안양 있다고 가정 해 봅시다 색인 생성 조건 :

나는 이것을 조금 연구했는데, 그 기본적인 특징은 다음과 같다. numpy의 ers는 어떤 조건이나 모든 경우에 따라 특정 조건이 모호 할 수 있다고 결정했습니다. 내가 얻을 수없는 이유는 값이> 0.5인지 검사하는 것이 유효하고 < 0이 유효한지 확인하지만 0.5보다 큰지 또는 0보다 작은 값인지 확인하는 것입니다. 나는 또한 부울 구문을 섞어 보려고했지만이 오류는 escable에있다. OR을하는 것이 모호한 사례를 만드는 이유를 설명 할 수 있습니까?

답변

3

:

이것은 당신이 비트 또는 연산자를 사용 할 필요가 있다는 것을 의미합니다. 즉, Numpy는 [0, 1, 1] and [1, 1, 0][0, 1, 0]이라고 말하기는 불가능합니다. 이것은 and 동작이 단락 (the documentation 참조)되는 이유 때문입니다. 본질적으로 andor의 단락 동작은 이러한 연산이 두 개의 인수에 대해 두 개의 개별 진리 값으로 작동해야 함을 의미합니다. 그들은 두 피연산자를 동시에 두 피연산자의 데이터를 사용하는 어떤 방법으로 결합 할 수 없습니다 (예를 들어, Numpy에 대해 자연스러운 것처럼 요소를 구성 요소와 비교하는 경우).

해결 방법은 비트 연산자 &|을 사용하는 것입니다. 그러나 우선 순위는 예상 할 수있는 것이 아니므로주의해야합니다.

+0

흥미 롭군요, 나는 그 행동을 멍청한 것으로 알고 있지 않았습니다.우선 순위가 항상 예상되는 것은 아니라고 말하면 어떤 부작용이 있습니까? 복합 부울 표현식을 기반으로 numpy/pandas 객체를 필터링하는 관용적 방법이 있습니까? – user3299166

+0

@ user3299166 : 비트 연산자는 비교 연산자보다 우선 순위가 높습니다. 예를 들어 '1 <2 & 0 <1'은 false입니다 ('1 <(2 & 0) <1')로 해석됩니다. 비트 연산자를 사용하지만 피연산자를 괄호로 묶어 'df [(df.A <5) & (df.B> 0)]'와 같은 예기치 않은 결과를 피하십시오. – BrenBarn

1

당신은 괄호 안의 조건을 비트 OR을 사용하여 둘 필요가 : 어쩌면 배열에있는 값의 일부는 조건을 만족하는 경우 배열을 비교 모호하기 때문에

df[(df > 0.5) | (df < 0)] 

이유는, 즉 왜 그것이 모호해진다.

any 속성을 호출 한 경우 True로 평가됩니다.

연산자 우선 순위 때문에 괄호가 필요합니다.

예 : 논리 연산자 이후

In [23]: 

df = pd.DataFrame(randn(5,5)) 
df 
Out[23]: 
      0   1   2   3   4 
0 0.320165 0.123677 -0.202609 1.225668 0.327576 
1 -0.620356 0.126270 1.191855 0.903879 0.214802 
2 -0.974635 1.712151 1.178358 0.224962 -0.921045 
3 -1.337430 -1.225469 1.150564 -1.618739 -1.297221 
4 -0.093164 -0.928846 1.035407 1.766096 1.456888 
In [24]: 

df[(df > 0.5) | (df < 0)] 
Out[24]: 
      0   1   2   3   4 
0  NaN  NaN -0.202609 1.225668  NaN 
1 -0.620356  NaN 1.191855 0.903879  NaN 
2 -0.974635 1.712151 1.178358  NaN -0.921045 
3 -1.337430 -1.225469 1.150564 -1.618739 -1.297221 
4 -0.093164 -0.928846 1.035407 1.766096 1.456888 
+0

any()를 사용하여 원하는 필터링을 수행하는 방법이 있습니까? – user3299166

+0

솔직히 말해서별로 사용하지 않을 것이다. 본질적으로 여전히 비트 연산자를 사용해야하며'df [df.any()> 0.5]라고 말하면, 단일 요소가 만족되면 전체 df를 반환 할 것이다. 별로 쓸모가없는 조건 – EdChum

1

파이썬, NumPy와의 재정의하지와 팬더는 비트 연산자 우선합니다. 사용자 정의 유형 and와 파이썬에서 or의 동작을 재정의하는 것은 가능하지 않다

df[(df > 0.5) | (df < 0)]