我怎样才能获得一个pandas系列的元素合乎逻辑的NOT?
今天我有一个比较简单的问题。 我有一个包含布尔值的pandasSeries
对象。 我怎样才能得到一系列包含每个值的逻辑NOT
?
例如,考虑一系列包含:
True True True False
我想要得到的系列将包含:
False False False True
这似乎应该是相当简单的,但显然我错了我的魔羯今天=(
谢谢!
要颠倒布尔型系列,请使用~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
结果可能会因硬件,编译器,操作系统,Python,NumPy和Pandas版本等因素而异。
我只是给它一个镜头:
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
@ unutbu的答案是现货,只是想添加一个警告,你的面具需要dtype bool,而不是'对象'。 即你的面具不可能有任何南方的。 看到这里 – 即使你的面具是免费的,它仍然是“对象”types。
“对象”系列的反转不会抛出错误,而是会得到一个无法正常工作的垃圾掩码。
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
你也可以使用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