itsource

팬더 시리즈의 요소별 논리적 NOT를 얻으려면 어떻게 해야 합니까?

mycopycode 2023. 1. 8. 14:38
반응형

팬더 시리즈의 요소별 논리적 NOT를 얻으려면 어떻게 해야 합니까?

나는 판다를 키운다.Series부울 값을 포함하는 개체입니다.어떻게 하면 로직이 포함된 시리즈를 얻을 수 있을까요?NOT각 가치의?

예를 들어, 다음을 포함하는 시리즈를 생각해 보겠습니다.

True
True
True
False

구입하고 싶은 시리즈는 다음과 같습니다.

False
False
False
True

꽤 심플하다고 생각합니다만, 아무래도 mojo를 잘못 가져간 것 같습니다=(

부울 영상 시리즈를 반전하려면 다음을 사용합니다.

In [7]: s = pd.Series([True, True, False, True])

In [8]: ~s
Out[8]: 
0    False
1    False
2     True
3    False
dtype: bool

Python 2.7, NumPy 1.8.0, Panda 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

Panda 0.13.0을 기점으로 시리즈는 더 이상 다음 서브클래스가 아닙니다.numpy.ndarray; 그들은 현재 의 하위 분류이다.pd.NDFrame이게 왜 이런 일이 일어났을 수도 있어np.invert(s)보다 더 이상 빠르지 않다~s또는-s.

경고:timeit결과는 하드웨어, 컴파일러, OS, Python, NumPy, Panda 버전 등 여러 요소에 따라 달라질 수 있습니다.

@unutbu의 답변은 딱 맞습니다.마스크가 '객체'가 아니라 'dtype bool'이어야 한다는 경고를 추가하고 싶었습니다.네 마스크에 난이 있을 가 없어여기를 참조하십시오. 현재 마스크가 nan-free 상태일지라도 '객체' 유형으로 유지됩니다.

'개체' 시리즈의 역수에서는 오류가 발생하지 않고 예상대로 작동하지 않는 ints의 가비지 마스크가 나타납니다.

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

다음의 것도 사용할 수 있습니다.

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

여기서의 우수한 답변을 지원하기 위해, 그리고 미래의 편의를 위해, 열의 진실 값을 플립하고 다른 값을 동일하게 유지하는 경우가 있습니다(nan 값 등).

In[1]: series = pd.Series([True, np.nan, False, np.nan])
In[2]: series = series[series.notna()] #remove nan values
 
In[3]: series # without nan                                            
Out[3]: 
0     True
2    False
dtype: object

# Out[4] expected to be inverse of Out[3], pandas applies bitwise complement 
# operator instead as in `lambda x : (-1*x)-1`

In[4]: ~series
Out[4]: 
0    -2
2    -1
dtype: object

간단한 비표준화 솔루션으로서 1.유형을 체크할 수 있습니다.역부울

In[1]: series = pd.Series([True, np.nan, False, np.nan])

In[2]: series = series.apply(lambda x : not x if x is bool else x)
Out[2]: 
Out[2]: 
0     True
1      NaN
2    False
3      NaN
dtype: object

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

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

반응형