팬더 시리즈의 요소별 논리적 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
'itsource' 카테고리의 다른 글
PHP의 startsWith() 및 endsWith() 함수 (0) | 2023.01.08 |
---|---|
Python에서 MySQL 데이터베이스에 연결하는 방법은 무엇입니까? (0) | 2023.01.08 |
MariaDB 문자열 길이 확인 성능 (0) | 2023.01.08 |
Axios를 사용하여 Vue.js에서 여러 API 호출 취소 (0) | 2023.01.08 |
ui-router에서 ui-sref를 사용하여 파라미터를 컨트롤러에 전달하는 방법 (0) | 2023.01.08 |