A or B evaluates to A if A is "truey", else B. B is never evaluated
None, empty collections, empty strings and False are "falsey". Notice that in all these cases B (the right side expression) is printed.
print(None or [])
print("" or [])
print([] or None)
print(None or False)
Output:
[]
[]
None
False
To demonstrate when something is evaluated for truey-ness I wrote a class with a __bool__() method. When Python sees an object with a dunder bool method it uses that method to evaluate the truey-ness of the object. My dunder bool method prints a message so I can see when it is called.
class X:
def __bool__(self):
print("I am False", end = "-")
return False
x = X()
print("x or None", x or None)
print("None or x", None or x)
Output:
I am False-x or None None
None or x <__main__.X object at 0x000002EE09878400>
From the output you can see that x.__bool__() called in the first example but not the second. The second example returns x as the result of the "or", but there is no need to evaluate the truey-ness of x.
Things change if we need to know if the "or" expression is truey of falsey. In this example the "or" statement returns x as before. but this time the "if" statement needs to know if x is truey or falsey to decide which branch of code to execute.
x = X()
if (None or x):
print("Truey")
else:
print("Falsey")
Output:
I am False-Falsey
So how does this apply to your examples?
if btstats.loc[i,'Status'] == 'WINNER' or btstats.loc[i,'Status'] == 'LOSER':
I am going to replace this with:
A = (btstats.loc[i,'Status'] == 'WINNER')
B = (btstats.loc[i,'Status'] == 'LOSER')
if A or B:
We know the or statement returns A if A is truey, else it returns B. We also know that the "if" statement is going to evaluate the result of the "or" to determine which branch of code to execute. If bstats.loc[i, 'Status'] is either 'WINNER" or 'LOSER' the code following the if statement os execited.
if btstats.loc[i,'Status'] == ('WINNER' or 'LOSER'):
I am going to replace this with:
A = 'WINNER'
B = 'LOSER'
if bstats.loc[i, 'Status'] == (A or B):
We know both A and B are truey. The only str that is falsey is an empty str (""). Since A or B returns A if A is truey, this code is the same as:
if bstats.loc[i, 'Status'] == 'WINNER:
That probably isn't what you wanted.