当前位置: 首页 > 知识库问答 >
问题:

如何获得熊猫系列的元素级逻辑非?

程钧
2023-03-14

我有一个包含布尔值的pandas系列对象。如何获得包含每个值的逻辑而不是的序列?

例如,考虑包含以下内容的系列:

True
True
True
False

我想要的系列包括:

False
False
False
True

这看起来应该很简单,但显然我把我的魔力放错地方了=(


共有3个答案

乐正洲
2023-03-14

我只是试一试:

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
邴英毅
2023-03-14

@unutbu的回答很准确,只是想增加一个警告,你的面具需要是dtype bool,而不是“对象”。你的面具不可能有奶奶的。看这里-即使你的面具现在是无楠的,它仍然是“对象”类型。

“object”系列的倒数不会抛出错误,相反,你会得到一个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

正如@geher所说的,您可以先用astype将其转换为bool,然后再用astype反转~

~df['A'].astype(bool)
0    False
1     True
Name: A, dtype: bool
(~df['A']).astype(bool)
0    True
1    True
Name: A, dtype: bool
葛哲彦
2023-03-14

要反转布尔级数,请使用~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,熊猫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开始,系列不再是numpy.ndarray的子类;它们现在是pd.NDFrame的子类。这可能与为什么np.invert(s)不再像~s-s那么快有关。

警告:timeit结果可能因硬件、编译器、操作系统、Python、NumPy和Pandas版本等多种因素而有所不同。

 类似资料:
  • 问题内容: 我有一个包含布尔值的pandas对象。如何获得包含每个值逻辑的序列? 例如,考虑一个包含以下内容的系列: 我想要获得的系列将包含: 这似乎应该相当简单,但显然我放错了我的mojo =( 问题答案: 要反转布尔系列,请使用: 使用Python2.7,NumPy 1.8.0,Pandas 0.13.1: 从Pandas 0.13.0开始,Series不再是;的子类。它们现在是的子类。这可能

  • 问题内容: 我想要按元素进行逻辑或运算符。我知道“或”本身不是我想要的。 我知道AND对应于NOT 。但是OR呢? 问题答案: 相应的运算符是: 将按元素检查值是否小于3或等于5。 如果您需要执行此操作的功能,我们有 。对于两个条件,您可以使用 或者,对于多种情况,请使用, 由于条件被指定为单独的参数, 因此不需要括号分组。

  • 问题内容: 如何获得系列中最常出现的物品? 考虑系列 返回值应该是 问题答案: 您可以使用并提取第一个值: 这不一定是低效率的。与往常一样,对您的数据进行测试以查看适合的数据。

  • 问题内容: 如何将条件逻辑应用于Pandas DataFrame。 请参见下面显示的DataFrame, 我的原始数据显示在“数据”列中,并且期望的输出显示在其旁边。如果“数据”中的数字小于2.5,则所需的输出为False。 我可以应用循环并重新构建DataFrame …但是那是“非Python的” 问题答案: 只需将列与该值进行比较:

  • 我有一个series对象(一列),希望提取第一个元素的值。有没有一种方法可以简单地做到这一点,而无需转换为列表,也不需要知道密钥?或者是通过先使用将其转换为列表来访问它的唯一方法?

  • 我想基于多个条件的评估创建一系列新的逻辑值。 举个例子 然而,我想返回一个逻辑序列,即。 如果可能的话,我想用熊猫的方法。