답변:
부울 시리즈를 반전 시키려면 다음을 사용하십시오~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 버전을 포함한 많은 요소에 따라 달라질 수 있습니다.
-
? 의 차이점은 무엇 입니까?
tilde
문서에서 언급 한대로 테스트 했지만 다음과 같이 수행하지 않았습니다 np.invert
: S
np.invert(s)
, ~s
그리고 -s
모두 동일합니다.
np.bitwise_not(s)
과 동일 np.inverse
)을 사용합니다.
@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
.astype(bool)
예 를 들어~df['A'].astype(bool)
astype(bool)
~
~df['A'].astype(bool)
(~df['A']).astype(bool)
당신은 또한 사용할 수 있습니다 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
object
아래 답변이 작동하는 유형이 포함되어 있지 않아야합니다 .~ df.astype('bool')