为什么 pandas 布尔系列需要 () 才能与布尔运算符一起使用? [重复]

问题描述 投票:0回答:1

我已经看到,如果将布尔系列传递给与数据帧中的行长度相同的数据帧,它会过滤数据帧。但是,如果我们传递一个条件而不是布尔系列(如

df['col']==value
)并希望对该条件执行布尔运算(如 ~ ),则即使条件的结果是布尔系列,它也不起作用。仅当它被括号包围时才有效。换句话说,这有效
df[~(df['col']>value)]
而这不起作用
df[~df['col']>value]
,请注意唯一的区别是括号

我认为括号对应用

df['col']>value
产生的布尔序列做了一些操作,比如将其转换为另一种支持
~
等操作的对象。但事实并非如此,
type(df['col']>value)
type((df['col']>value))
是相同的,即“pandas.core.series.Series”。那么那些括号在做什么来启用使用条件产生的布尔系列呢?

此外,如果您有两个通过对数据框应用条件而派生的 boolean_series,例如

series_a=df['col']>value
series_b=df['col']==value
并且您尝试将它们与
&
运算符一起使用,这样
df[series_a & series_b]
实际上工作得很好。但是在数据帧内计算它们不起作用
df[df['col']>value & df['col']==value]
,它会给出错误
TypeError: unsupported operand type(s) for &: 'int' and 'IntegerArray'
从该错误中,我假设发生的运算符有一些优先级,因为它似乎试图将 & 应用于 IntegerArray,可能会这样做:
df['col']> (value & df['col']) ==value
但我想要求确认

示例: 假设我们有一些数据框,其列

tag
具有值 A 或 B

import pandas as pd
import numpy as np
import random

df=pd.DataFrame({'tag'=[random.choice['A','B' for i in range(100)]}

如果我尝试这样做进行过滤:

df[~(df['tag']=='A')]

它可以工作,但是如果我在没有这些括号的情况下执行此操作,则不会出现此错误

TypeError: bad operand type for unary ~: 'str'

df[~df['tag']=='A']
python pandas series
1个回答
1
投票

这是一个运算符优先级的问题。当您提供两个操作(

~
>
)时,Python 必须决定先应用哪一个。在

~df['col']>value

~
具有更高的优先级,因此它先行。您否定了数据框,然后进行了比较。与
(~(df['col'])) > value
相同。

如果要比较然后取反,则必须使用括号以避免出现不需要的运算顺序。括号内的表达式具有最高优先级。在

~(df['col']>value)

先进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.