[python] 팬더 시리즈의 요소 별 논리 NOT을 어떻게 얻을 수 있습니까?
Series
부울 값을 포함 하는 팬더 객체가 있습니다. NOT
각 값 의 논리 를 포함하는 시리즈를 어떻게 얻을 수 있습니까?
예를 들어 다음을 포함하는 시리즈를 고려하십시오.
True
True
True
False
내가 얻고 싶은 시리즈에는 다음이 포함됩니다.
False
False
False
True
이것은 합리적으로 간단 해야하는 것처럼 보이지만 분명히 mojo = (
답변
부울 시리즈를 반전 시키려면 다음을 사용하십시오~s
.
In [7]: s = pd.Series([True, True, False, True])
In [8]: ~s
Out[8]:
0 False
1 False
2 True
3 False
dtype: bool
Python2.7, NumPy 1.8.0, Pandas 0.13.1 사용 :
In [119]: s = pd.Series([True, True, False, True]*10000)
In [10]: %timeit np.invert(s)
10000 loops, best of 3: 91.8 µs per loop
In [11]: %timeit ~s
10000 loops, best of 3: 73.5 µs per loop
In [12]: %timeit (-s)
10000 loops, best of 3: 73.5 µs per loop
Pandas 0.13.0부터 Series는 더 이상 하위 클래스가 아닙니다 numpy.ndarray
. 그들은 이제 하위 클래스입니다 pd.NDFrame
. np.invert(s)
더 이상 ~s
또는 보다 빠르지 않은 이유와 관련이있을 수 있습니다 -s
.
주의 사항 : timeit
결과는 하드웨어, 컴파일러, OS, Python, NumPy 및 Pandas 버전을 포함한 많은 요소에 따라 달라질 수 있습니다.
답변
@unutbu의 대답은 바로, 마스크가 ‘객체’가 아니라 dtype bool이어야한다는 경고를 추가하고 싶었습니다. 즉, 마스크 에는 난 이 없었 습니다. 여기를 참조 하십시오 -마스크에 난이없는 경우에도 ‘개체’유형으로 유지됩니다.
‘객체’시리즈의 역은 오류를 발생시키지 않으며 대신 예상대로 작동하지 않는 int의 가비지 마스크를 얻습니다.
In[1]: df = pd.DataFrame({'A':[True, False, np.nan], 'B':[True, False, True]})
In[2]: df.dropna(inplace=True)
In[3]: df['A']
Out[3]:
0 True
1 False
Name: A, dtype object
In[4]: ~df['A']
Out[4]:
0 -2
0 -1
Name: A, dtype object
이것에 대해 동료들과 이야기 한 후 설명이 있습니다. 팬더가 비트 연산자로 되돌아 오는 것 같습니다.
In [1]: ~True
Out[1]: -2
@geher가 말했듯이 ~와 반대로하기 전에 astype을 사용하여 bool로 변환 할 수 있습니다
~df['A'].astype(bool)
0 False
1 True
Name: A, dtype: bool
(~df['A']).astype(bool)
0 True
1 True
Name: A, dtype: bool
답변
나는 단지 그것을 쏴 :
In [9]: s = Series([True, True, True, False])
In [10]: s
Out[10]:
0 True
1 True
2 True
3 False
In [11]: -s
Out[11]:
0 False
1 False
2 False
3 True
답변
당신은 또한 사용할 수 있습니다 numpy.invert
:
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: s = pd.Series([True, True, False, True])
In [4]: np.invert(s)
Out[4]:
0 False
1 False
2 True
3 False
편집 : 성능 차이가 Ubuntu 12.04, Python 2.7, NumPy 1.7.0에 나타납니다 .NumPy 1.6.2를 사용하여 존재하지 않는 것 같습니다.
In [5]: %timeit (-s)
10000 loops, best of 3: 26.8 us per loop
In [6]: %timeit np.invert(s)
100000 loops, best of 3: 7.85 us per loop
In [7]: %timeit ~s
10000 loops, best of 3: 27.3 us per loop
답변
NumPy는 입력을 부울 값으로 캐스트하기 때문에 속도가 느립니다 (따라서 None과 0은 False가되고 나머지는 모두 True가됩니다).
import pandas as pd
import numpy as np
s = pd.Series([True, None, False, True])
np.logical_not(s)
너에게 준다
0 False
1 True
2 True
3 False
dtype: object
반면 ~ s는 충돌합니다. 대부분의 경우 물결표가 NumPy보다 안전한 선택입니다.
팬더 0.25, NumPy 1.17