ich dies nur bemerkt haben:Pandas logische und Betreiber mit und ohne Klammern zu unterschiedlichen Ergebnissen
df[df.condition1 & df.condition2]
df[(df.condition1) & (df.condition2)]
Warum der Ausgang dieser beiden Linien unterscheiden?
ich nicht die genauen Daten gemeinsam nutzen können, aber ich versuche ich werde so detailliert wie möglich zu bieten:
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
Dank hier an @jezrael und @ayhan, was passiert ist, und lassen Sie mich das Beispiel von @jezael bereitgestellt verwenden:
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
Wenn wir einen Blick auf Zeile 3:
col1 col2
3 False 1.0
und die Art, wie ich die Bedingung schrieb:
df.col1 == False & df.col2.isnull() # is equivalent to False == False & False
Da die &
Zeichen höhere Priorität hat als ==
, ohne Klammern False == False & False
ist Äquivalent:
False == (False & False)
print(False == (False & False)) # prints True
Mit Klammern:
print((False == False) & False) # prints False
Ich denke, es ist ein wenig einfacher ist es, dieses Problem mit Zahlen zu verdeutlichen:
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
So Lektionen gelernt: immer Klammern hinzuzufügen !!!
Ich wünschte, ich kann die Antwort Punkte sowohl @jezrael und @ayhan gespalten :(
So die Betreiber Priorität hat, bin ich immer noch verwirrt. – Cheng
'Die folgende Tabelle fasst die Rangfolge der Operatoren in Python zusammen, von der niedrigsten Priorität (niedrigste Bindung) bis zur höchsten Priorität (am meisten bindend). 'so denke ich' & 'hat höhere Priorität als' == '. Bitte beachten Sie das aktualisierte OP – Cheng