Właśnie zauważyłem to:pandy i operator logiczny i bez wsporników daje różne wyniki
df[df.condition1 & df.condition2]
df[(df.condition1) & (df.condition2)]
Dlaczego wyjście z tych dwóch linii różnią?
Nie mogę udostępnić dokładne dane, ale mam zamiar starać się zapewnić jak najwięcej szczegółów, jak tylko mogę:
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
Dzięki @jezrael i @ayhan, tutaj jest to, co się stało, i pozwól mi posłużyć się przykładem dostarczone przez @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
Jeśli spojrzeć na wiersz 3:
col1 col2
3 False 1.0
i sposób pisałem warunek:
df.col1 == False & df.col2.isnull() # is equivalent to False == False & False
Ponieważ znak &
ma wyższy priorytet niż ==
, bez nawiasów False == False & False
jest równoznaczne z:
False == (False & False)
print(False == (False & False)) # prints True
ze wspornikami:
print((False == False) & False) # prints False
myślę, że jest trochę łatwiej zilustrować ten problem z numerami:
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
Więc wnioski: zawsze dodać nawiasy !!!
Życzę mogę podzielić punkty odpowiedź na oba @jezrael i @ayhan :(
Więc który operator wziął priorytet, nadal jestem zdezorientowany. – Cheng
'Poniższa tabela podsumowuje pierwszeństwo operatora w języku Python, od najniższego pierwszeństwa (najmniejszego wiązania) do najwyższego priorytetu (najbardziej wiążącego). "więc myślę, że' & 'ma wyższy priorytet niż' == '. Zobacz zaktualizowany OP – Cheng