시리즈의 진실 가치는 모호합니다. a.empty, a.bool (), a.item (), a.any () 또는 a.all ()을 사용하십시오.

python pandas dataframe boolean filtering


or 조건으로 결과 데이터 프레임을 필터링하는 데 문제가 있습니다. 결과 df 가 0.25보다 크고 -0.25보다 작은 모든 열 var 값 을 추출하기를 원합니다 .

아래의 논리는 모호한 진실 값을 제공하지만이 필터링을 두 개의 별도 작업으로 나눌 때 작동합니다. 여기서 무슨 일이 일어나고 있습니까? 제안 된 a.empty(), a.bool(), a.item(),a.any() or a.all() 어디에 사용 해야하는지 확실하지 않습니다 .

 result = result[(result['var']>0.25) or (result['var']<-0.25)]



Answer 1 MSeifert


orand 파이썬 문은 필요 truth -values을. 들어 pandas 는 "비트"를 사용한다 그래서이 모호 간주됩니다 | (또는) 또는 & (및) 연산 :

result = result[(result['var']>0.25) | (result['var']<-0.25)]

이러한 종류의 데이터 구조에는 요소별로 or (또는 and ) 을 생성하기 위해 오버로드됩니다 .


이 문장에 더 많은 설명을 추가하십시오.

당신이 얻고 싶은 경우는 예외가 발생 bool (A)의 pandas.Series 를 :

>>> import pandas as pd
>>> x = pd.Series([1])
>>> bool(x)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

당신이 명중하면 운영자가 장소였다 암시 적 으로 피연산자를 변환 bool (당신이 사용 or 뿐만 아니라 위해 발생 and , ifwhile ) :

>>> x or x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> x and x
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> if x:
...     print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> while x:
...     print('fun')
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

이 4 개의 문장 외에도 일부 bool 호출 을 숨기는 몇 가지 파이썬 함수가 있습니다 (예 : any , all , filter , ...). pandas.Series 는 하지만 완전성을 위해 나는이 언급하고 싶었다.


귀하의 경우 예외는 올바른 대안을 언급하지 않기 때문에 실제로 도움이되지 않습니다 . for and / or 사용할 수 있습니다 (요소 별 비교를 원하는 경우).

  • numpy.logical_or:

    >>> import numpy as np
    >>> np.logical_or(x, y)

    또는 단순히 | 운영자:

    >>> x | y
  • numpy.logical_and:

    >>> np.logical_and(x, y)

    또는 단순히 & 연산자 :

    >>> x & y

연산자를 사용하는 경우 연산자 우선 순위 때문에 괄호를 올바르게 설정했는지 확인하십시오 .

가 있습니다 여러 가지 논리적 NumPy와 기능을 해야 작업 pandas.Series 은 .


예외에 언급 된 대안은 if 또는 while 을 . 나는 이들 각각을 간단히 설명 할 것이다 :

  • 시리즈가 비어 있는지 확인하려면 :

    >>> x = pd.Series([])
    >>> x.empty
    True
    >>> x = pd.Series([1])
    >>> x.empty
    False

    파이썬은 일반적으로 해석 len (같은 용기의 GTH list , tuple 은 명시 적 부울 해석이없는 경우 진리 값을, ...). 따라서 파이썬과 같은 검사 를 if x 대신 if x.size 또는 if not x.empty 아닌 경우 수행 할 수 있습니다.

  • Series 에 부울 값이 하나만 포함 된 경우 :

    >>> x = pd.Series([100])
    >>> (x > 50).bool()
    True
    >>> (x < 50).bool()
    False
  • 시리즈 의 첫 번째 항목 만 확인하려면 (예 : .bool() 부울 내용이 아닌 경우에도 작동 함) :

    >>> x = pd.Series([100])
    >>> x.item()
    100
  • 당신이 있는지 확인하려면 모든 또는 어떤 항목이 비어 있지 않거나 거짓되지 아니 0이 :

    >>> x = pd.Series([0, 1, 2])
    >>> x.all()   # because one element is zero
    False
    >>> x.any()   # because one (or more) elements are non-zero
    True



Answer 2 Alexander


부울 논리의 경우 &| .

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))

>>> df
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
2  0.950088 -0.151357 -0.103219
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

>>> df.loc[(df.C > 0.25) | (df.C < -0.25)]
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

무슨 일이 일어나고 있는지 확인하려면 각 비교에 대해 부울 열을 얻습니다.

df.C > 0.25
0     True
1    False
2    False
3     True
4     True
Name: C, dtype: bool

여러 기준이 있으면 여러 열이 반환됩니다. 이것이 결합 논리가 모호한 이유입니다. 사용 and 하거나 or 먼저 필요가 하나의 부울 값으로 해당 열을 줄일 수 있도록 별도로 각 열을 취급합니다. 예를 들어, 각 열의 값 또는 모든 값이 True인지 확인하십시오.

# Any value in either column is True?
(df.C > 0.25).any() or (df.C < -0.25).any()
True

# All values in either column is True?
(df.C > 0.25).all() or (df.C < -0.25).all()
False

동일한 일을 달성하는 한 가지 복잡한 방법은 이러한 모든 열을 함께 압축하고 적절한 논리를 수행하는 것입니다.

>>> df[[any([a, b]) for a, b in zip(df.C > 0.25, df.C < -0.25)]]
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

자세한 내용은 부울 인덱싱을 참조하십시오. 은 문서의 을 .




Answer 3 Nipun


팬더는 비트 단위 '&' '|'를 사용합니다. 각 조건은 '()'

예를 들어 다음 작품

data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]

그러나 적절한 대괄호가없는 동일한 쿼리는 그렇지 않습니다.

data_query = data[(data['year'] >= 2005 & data['year'] <= 2010)]



Answer 4 Cảnh Toàn Nguyễn


또는 운영자 모듈을 사용할 수도 있습니다. 더 자세한 정보는 여기 파이썬 문서

import operator
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5,3), columns=list('ABC'))
df.loc[operator.or_(df.C > 0.25, df.C < -0.25)]

          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.4438



Answer 5 bli


이 훌륭한 답변 은 무슨 일이 일어나고 있는지 잘 설명하고 해결책을 제공합니다. 비슷한 경우에 적합한 다른 솔루션을 추가하고 싶습니다 : query 방법 사용 :

result = result.query("(var > 0.25) or (var < -0.25)")

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-query 도 참조 하십시오 .

(현재 작업중 인 데이터 프레임을 사용한 일부 테스트는이 방법이 일련의 부울에서 비트 연산자를 사용하는 것보다 약간 느리다는 것을 제안합니다 : 2 ms 대 870 µs

경고 : 간단하지 않은 적어도 하나의 상황은 열 이름이 파이썬 표현식이되는 경우입니다. WT_38hph_IP_2 , WT_38hph_input_2log2(WT_38hph_IP_2/WT_38hph_input_2) 라는 열이 있고 "(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)" 쿼리를 수행하려고했습니다.

다음 예외 캐스케이드를 얻었습니다.

  • KeyError: 'log2'
  • UndefinedVariableError: name 'log2' is not defined
  • ValueError: "log2" is not a supported function

쿼리 파서가 세 번째 열의 이름으로 식을 식별하는 대신 처음 두 열에서 무언가를 만들려고했기 때문에 이것이 발생했다고 생각합니다.

가능한 해결 방법이 여기 에 제안 됩니다 .