IT story

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

hot-time 2020. 5. 13. 08:04
반응형

팬더 시리즈의 요소 별 논리 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

나는 단지 그것을 쏴 :

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

EDIT: The difference in performance appears on Ubuntu 12.04, Python 2.7, NumPy 1.7.0 - doesn't seem to exist using NumPy 1.6.2 though:

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

참고URL : https://stackoverflow.com/questions/15998188/how-can-i-obtain-the-element-wise-logical-not-of-a-pandas-series

반응형