# from #60234 OP
ser1 = pd.Series([False, False])
ser2 = pd.Series([0.0, 0.1])
ser1 | ser2 # <- works by casting floats to bool
ser2 | ser1 # <- raises TypeError
# We also have special-casing for NaNs among floats
ser3 = pd.Series([np.nan, 1.0])
ser3 & ser3 # <- raises bc you can't do float & float
ser3[:-1] & ser3[:-1] # has no non-NaN floats so we special-case
logical ops (&, |, ^) have inconsistent behavior. I think we should simplify this significantly and more closely resemble the numpy behavior.