시리즈의 진실 가치는 모호합니다. a.empty, a.bool (), a.item (), a.any () 또는 a.all ()을 사용하십시오.
or
조건으로 결과 데이터 프레임을 필터링하는 데 문제가 있습니다. 결과 df
가 var
0.25보다 크고 -0.25보다 작은 모든 열 값 을 추출하기를 원합니다 .
아래의 논리는 모호한 진실 값을 제공하지만이 필터링을 두 개의 별도 작업으로 나눌 때 작동합니다. 여기서 무슨 일이 일어나고 있습니까? 제안 된 위치를 잘 모르겠습니다 a.empty(), a.bool(), a.item(),a.any() or a.all()
.
result = result[(result['var']>0.25) or (result['var']<-0.25)]
or
및 and
파이썬 문은 필요 truth
-values합니다. 들어 pandas
사용 "비트 단위"해야하므로 이러한 모호함으로 간주된다 |
(또는) 또는 &
작업 (과) :
result = result[(result['var']>0.25) | (result['var']<-0.25)]
이들은 이러한 종류의 데이터 구조에 대해 과부하되어 요소 단위 or
(또는 and
) 를 산출합니다 .
이 문장에 더 많은 설명을 추가하십시오.
의를 얻으려고 할 때 예외가 발생 bool
합니다 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
, if
및 while
).
>>> 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
당신은 사용할 수 있습니다 (요소 별 비교를 원한다면) :
-
>>> import numpy as np >>> np.logical_or(x, y)
또는 단순히
|
운영자 :>>> x | y
-
>>> 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.size
나if not x.empty
대신if x
.부울 값이 하나만
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
부울 논리의 경우 &
및을 사용하십시오 |
.
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
자세한 내용 은 문서의 부울 인덱싱 을 참조하십시오 .
또는 운영자 모듈을 사용할 수도 있습니다. 더 자세한 정보는 여기 파이썬 문서
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
이 훌륭한 답변 은 무슨 일이 일어나고 있는지 잘 설명하고 해결책을 제공합니다. 비슷한 경우에 적합한 다른 솔루션을 추가하고 싶습니다 : query
메소드 사용 :
result = result.query("(var > 0.25) or (var < -0.25)")
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-query 도 참조 하십시오 .
(현재 작업중 인 데이터 프레임을 사용한 일부 테스트는이 방법이 일련의 부울에서 비트 연산자를 사용하는 것보다 약간 느리다는 것을 제안합니다 : 2ms 대 870µs)
경고 : 간단하지 않은 적어도 하나의 상황은 열 이름이 파이썬 표현식이되는 경우입니다. 나는 열 이름을 가지고 WT_38hph_IP_2
, WT_38hph_input_2
그리고 log2(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
쿼리 파서가 세 번째 열의 이름으로 식을 식별하는 대신 처음 두 열에서 무언가를 만들려고했기 때문에 이것이 발생했다고 생각합니다.
팬더는 비트 단위 '&' '|'를 사용합니다. 각 조건은 '()'
예를 들어 다음 작품
data_query = data[(data['year'] >= 2005) & (data['year'] <= 2010)]
그러나 적절한 대괄호가없는 동일한 쿼리는 그렇지 않습니다.
data_query = data[(data['year'] >= 2005 & data['year'] <= 2010)]
'IT' 카테고리의 다른 글
AttributeError : 'NoneType'개체에 'something'특성이없는 이유는 무엇입니까? (0) | 2020.04.01 |
---|---|
Java에서 일반 배열 유형을 만들 수없는 이유는 무엇입니까? (0) | 2020.04.01 |
C ++에 가비지 수집기가없는 이유는 무엇입니까? (0) | 2020.04.01 |
PyPy — CPython을 어떻게 이길 수 있습니까? (0) | 2020.04.01 |
Java-현재 클래스 이름을 얻습니까? (0) | 2020.04.01 |