我刚刚注意到了这一点:
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,即等于 因此,如果您明确想要 相反,您必须在括号中加上括号