[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


답변