我怎样才能获得一个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