当前位置: 首页 > 面试题库 >

带有和不带有括号的熊猫逻辑和运算符会产生不同的结果

楚洋
2023-03-14
问题内容

我刚刚注意到了这一点:

df[df.condition1 & df.condition2]
df[(df.condition1) & (df.condition2)]

为什么这两行的输出不同?

我无法分享确切的数据,但我将尝试提供尽可能多的详细信息:

df[df.col1 == False & df.col2.isnull()] # returns 33 rows and the rule `df.col2.isnull()` is not in effect
df[(df.col1 == False) & (df.col2.isnull())] # returns 29 rows and both conditions are applied correctly

感谢@jezrael和@ayhan,这就是发生的事情,让我使用@jezael提供的示例:

df = pd.DataFrame({'col1':[True, False, False, False],
                   'col2':[4, np.nan, np.nan, 1]})

print (df)
    col1  col2
0   True   4.0
1  False   NaN
2  False   NaN
3  False   1.0

如果我们看一下第3行:

    col1  col2
3  False   1.0

以及我写条件的方式:

df.col1 == False & df.col2.isnull() # is equivalent to False == False & False

由于&符号的优先级高于==,因此不带方括号False == False & False的等效于:

False == (False & False)
print(False == (False & False)) # prints True

带括号:

print((False == False) & False) # prints False

我认为用数字说明这个问题要容易一些:

print(5 == 5 & 1) # prints False, because 5 & 1 returns 1 and 5==1 returns False
print(5 == (5 & 1)) # prints False, same reason as above
print((5 == 5) & 1) # prints 1, because 5 == 5 returns True, and True & 1 returns 1

因此,经验教训是:总是加括号!!!

我希望我可以将答案分别分配给@jezrael和@ayhan :(


问题答案:

df[condition1 & condition2] 和之间没有区别df[(condition1) & (condition2)]。当您编写表达式并且运算符&具有优先权时,会出现区别:

df = pd.DataFrame(np.random.randint(0, 10, size=(5, 3)), columns=list('abc'))    
df
Out: 
   a  b  c
0  5  0  3
1  3  7  9
2  3  5  2
3  4  7  6
4  8  8  1

condition1 = df['a'] > 3
condition2 = df['b'] < 5

df[condition1 & condition2]
Out: 
   a  b  c
0  5  0  3

df[(condition1) & (condition2)]
Out: 
   a  b  c
0  5  0  3

但是,如果您这样输入,则会看到错误消息:

df[df['a'] > 3 & df['b'] < 5]
Traceback (most recent call last):

  File "<ipython-input-7-9d4fd21246ca>", line 1, in <module>
    df[df['a'] > 3 & df['b'] < 5]

  File "/home/ayhan/anaconda3/lib/python3.5/site-packages/pandas/core/generic.py", line 892, in __nonzero__
    .format(self.__class__.__name__))

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是因为3 & df['b']首先进行评估(这与False & df.col2.isnull()您的示例相对应)。因此,您需要将条件分组在括号中:

df[(df['a'] > 3) & (df['b'] < 5)]
Out[8]: 
   a  b  c
0  5  0  3


 类似资料:
  • 问题内容: 我注意到,如果使用许多不带括号的DataFrame函数,其行为似乎类似于“属性”,例如 这是如何完成的,是一种好的做法?这是Linux上的熊猫0.15.1 问题答案: 它们是不同的,因此不建议使用,它们清楚地表明这是一种方法并且恰好输出结果,而另一种则表明了预期的输出。 这就是为什么您不应该这样做的原因: 所以好吧,您没有使用括号正确地调用该方法并看到显示为有效的输出,但是如果您引用了

  • 我想要一个函数 例如,我们有, 或者在代码中,其中 和 是 32 位有符号整数: 这里有一个棘手的部分:如何有效地实现这一功能(不使用更大的64位值),并且不使用诸如

  • 我试图写一个程序,读取一串文本,并打印文本中的所有直方图及其频率。 输入示例: 相应的输出: 当我尝试这个示例输入时,它输出 我该如何修复它,使它不会有括号和逗号?

  • 问题内容: 是否有任何示例说明如何在Pandas中通过SQL查询传递参数? 特别是我正在使用SQLAlchemy引擎连接到PostgreSQL数据库。到目前为止,我发现以下工作原理: Pandas文档说,params也可以作为dict传递,但是例如,我似乎无法通过尝试使它起作用: 建议从熊猫运行这些类型的查询的方法是什么? 问题答案: 该文件说这个参数可以是一个列表,元组或字典(见文档)。 通过在

  • 问题内容: 我还没有找到任何官方文档。但是afaik,是否在没有括号的情况下使用我们的类实例化没有关系-只要不涉及参数,对吗? 要么 但是谁能告诉我性能是否有所不同?“更正确”的方法是哪一种?有任何官方文件吗? 问题答案: 性能上的任何差异将绝对可以忽略。 虽然这两种方式都很好,我个人更喜欢使用 ,因为通常情况下,一个方法 是 正在这里所说的,和PHP函数/方法调用时需要。而且,它与带有参数的实例

  • 问题内容: 我有这个查询: 哪个不会返回正确的结果。但是,在“或”条件周围加上括号可使其工作如下: 我的问题是为什么与众不同?我知道这是在考虑不带括号的OR语句;但我不知道它有什么不同。 我尚未找到任何对此有所帮助的文档。如果有任何链接,我将非常感谢。 问题答案: 这是因为OR的 运算符优先级 低于AND。每当DB看到类似 首先评估AND,即等于 因此,如果您明确想要 相反,您必须在括号中加上括号