pandas, numpy 객체는 원소 단위로 연산이 이루어진다.
In [1]: import pandas as pd
In [2]: a=pd.DataFrame([0]*3)
In [3]: b=pd.DataFrame([2]*3)
In [4]: a
Out[4]:
0
0 0
1 0
2 0
In [5]: b
Out[5]:
0
0 2
1 2
2 2
In [6]: a+b
Out[6]:
0
0 2
1 2
2 2
이러한 점은 각 원소 단위로 boolean, 비교 연산이 이루어진다는 것을 의미한다. 그러나 그 결과는 모호하다. 다음을 보자.
In [7]: a.ix[1] ==0
Out[7]:
0 True
Name: 1, dtype: bool
위의 경우는 정상적인 결과를 반환한다.
그러나 다음은 같은 원소를 bool로 판단하기 위한 것이다. 원소값이 0이므로 False가 예산된다.
In [9]: bool(a.ix[1])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-8cb7437508dd> in <module>()
----> 1 bool(a.ix[1])
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1119 raise ValueError("The truth value of a {0} is ambiguous. "
1120 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1121 .format(self.__class__.__name__))
1122
1123 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
결과는 에러가 발생한다. 설명은 Series의 객체 값이 모호하다는 것이다.
비교 등과 같은 논리연산의 경우 대상이 기본자료형(int, float, str 등)과 정확한 값을 요구한다. 아래 코드[10]의 결과와 같이 대상의 자료형은 Series의 한 원소라 해도 여전히 Series 객체형이 된다.
In [10]: type(a.ix[1])
Out[10]: pandas.core.series.Series
그러므로 어떠한 정확한 값에 의하 판단보다는 대략적인 판단 아래와 같이 all(모두가 참일때 참을 반환) 이나 any(모두가 거짓일 때 거짓을 반환)과 같은 연산자를 사용하여 논리 연산의 결과를 반환할 수 있다.
In [12]: a.ix[1].all()
Out[12]: False
In [13]: a.ix[1].any()
Out[13]: False
In [14]: all(b.ix[1])
Out[14]: True
In [15]: any(b.ix[1])
Out[15]: True
또한 인덱스와 값을 터플 형식으로 반환하는 items()를 사용하여 판단할 수 있다.
In [16]: list(a.ix[1].items())
Out[16]: [(0, 0)]
In [17]: bool(list(a.ix[1].items())[0][1])
Out[17]: False
In [18]: bool(list(b.loc[1].items())[0][1])
Out[18]: True
또한 가장 간단하게는 객체의 원소의 형변환을 통해 실행할 수 있다.
In [28]: bool(int(a.loc[1]))
Out[28]: False
In [29]: bool(int(b.loc[1]))
Out[29]: True
In [1]: import pandas as pd
In [2]: a=pd.DataFrame([0]*3)
In [3]: b=pd.DataFrame([2]*3)
In [4]: a
Out[4]:
0
0 0
1 0
2 0
In [5]: b
Out[5]:
0
0 2
1 2
2 2
In [6]: a+b
Out[6]:
0
0 2
1 2
2 2
이러한 점은 각 원소 단위로 boolean, 비교 연산이 이루어진다는 것을 의미한다. 그러나 그 결과는 모호하다. 다음을 보자.
In [7]: a.ix[1] ==0
Out[7]:
0 True
Name: 1, dtype: bool
위의 경우는 정상적인 결과를 반환한다.
그러나 다음은 같은 원소를 bool로 판단하기 위한 것이다. 원소값이 0이므로 False가 예산된다.
In [9]: bool(a.ix[1])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-8cb7437508dd> in <module>()
----> 1 bool(a.ix[1])
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1119 raise ValueError("The truth value of a {0} is ambiguous. "
1120 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1121 .format(self.__class__.__name__))
1122
1123 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
결과는 에러가 발생한다. 설명은 Series의 객체 값이 모호하다는 것이다.
비교 등과 같은 논리연산의 경우 대상이 기본자료형(int, float, str 등)과 정확한 값을 요구한다. 아래 코드[10]의 결과와 같이 대상의 자료형은 Series의 한 원소라 해도 여전히 Series 객체형이 된다.
In [10]: type(a.ix[1])
Out[10]: pandas.core.series.Series
그러므로 어떠한 정확한 값에 의하 판단보다는 대략적인 판단 아래와 같이 all(모두가 참일때 참을 반환) 이나 any(모두가 거짓일 때 거짓을 반환)과 같은 연산자를 사용하여 논리 연산의 결과를 반환할 수 있다.
In [12]: a.ix[1].all()
Out[12]: False
In [13]: a.ix[1].any()
Out[13]: False
In [14]: all(b.ix[1])
Out[14]: True
In [15]: any(b.ix[1])
Out[15]: True
또한 인덱스와 값을 터플 형식으로 반환하는 items()를 사용하여 판단할 수 있다.
In [16]: list(a.ix[1].items())
Out[16]: [(0, 0)]
In [17]: bool(list(a.ix[1].items())[0][1])
Out[17]: False
In [18]: bool(list(b.loc[1].items())[0][1])
Out[18]: True
또한 가장 간단하게는 객체의 원소의 형변환을 통해 실행할 수 있다.
In [28]: bool(int(a.loc[1]))
Out[28]: False
In [29]: bool(int(b.loc[1]))
Out[29]: True
댓글
댓글 쓰기