팬더 시리즈의 요소 별 논리 NOT을 어떻게 얻을 수 있습니까?


229

Series부울 값을 포함 하는 팬더 객체가 있습니다. NOT각 값 의 논리 를 포함하는 시리즈를 어떻게 얻을 수 있습니까?

예를 들어 다음을 포함하는 시리즈를 고려하십시오.

True
True
True
False

내가 얻고 싶은 시리즈에는 다음이 포함됩니다.

False
False
False
True

이것은 합리적으로 간단 해야하는 것처럼 보이지만 분명히 mojo = (


1
데이터에 object아래 답변이 작동하는 유형이 포함되어 있지 않아야합니다 .~ df.astype('bool')
LearnOPhile

이 게시물의 모든 논리 연산자에 대해 작성 했습니다 . 이 게시물에는 대안이 포함되어 있습니다.
cs95

답변:


260

부울 시리즈를 반전 시키려면 다음을 사용하십시오~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 버전을 포함한 많은 요소에 따라 달라질 수 있습니다.


정식 주목. 훨씬 느리게하는 것 외에, 물결표와 -? 의 차이점은 무엇 입니까?
blz

Wierd, 나는 실제로 tilde문서에서 언급 한대로 테스트 했지만 다음과 같이 수행하지 않았습니다 np.invert: S
root

@blz : NumPy와 1.6.2의 성능을 실행, 내 우분투 시스템에서 적어도 np.invert(s), ~s그리고 -s모두 동일합니다.
unutbu

@root : 시간 결과에 왜 그렇게 큰 불일치가 있는지 확실하지 않지만 확실히 발생할 수 있습니다. 어떤 OS 및 NumPy 버전을 사용하고 있습니까?
unutbu

또한 Ubuntu에서도 NumPy 1.7.0 ... ( np.bitwise_not(s)과 동일 np.inverse)을 사용합니다.
root

32

@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

예를 들어, 출력 ints 마스크는 원하는 bool 시리즈로 변환 될 수 있습니다. .astype(bool)예 를 들어~df['A'].astype(bool)
geher

astype(bool)~ ~df['A'].astype(bool)(~df['A']).astype(bool)
JSharm

16

나는 단지 그것을 쏴 :

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

문자 그대로 다른 모든 연산자를 시도했습니다 -! 다음에이 점을 명심하겠습니다.
blz

6

당신은 또한 사용할 수 있습니다 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

다른 플랫폼에서는 올바르지 않을 수 있습니다. Win 7, python 3.6.3 numpy 1.13.3, pandas 0.20.3, (-s)가 가장 빠를 것이고, (~ s)가 두 번째이며, np.invert (s)가 가장 느
립니다

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.