разница в том, что `and` - это логическая операция, её нельзя перекрыть, то есть нельзя у объекта реализовать метод, который будет реализовывать свой алгоритм вычисления результата операции.
Связано это со стандартными оптимизациями логических выражений, которые (оптимизации) есть почти во всех языках.
Грубо говоря операция `and` (конъюнкция) принимает два аргумента (слева и справа) и возвращает значение первого попавшегося ложного или последнего истинного, если все истины.
Например:
'one' and 0 # вернёт 0
'' and 13 # вернёт ''
3 and 5 # вернёт 5
Дезъюнкция (or) работает похожим образом, но возвращает первый попавшийся истинный рагумент, или последний ложный, если ложны оба:
3 or 5 # вернёт 3
'' or 'hello' # вернёт 'hello'
None or 0 # вернёт 0
При этом, если возвращается первый попавшийся подходящий аргумент, второй вообще вычисляться не будет. Там может быть целое выражение с вызовом функций, но вычисляться оно не будет, поскольку это значение не нужно. На самом деле это очень удобно и позволяет лаконично записывать многие вещи.
Операции & | по своему принципу работы ничем не отличаются от сложения, вычитания, умножения, деления, проверки на равенство и неравенство и многих других операций. Все эти операции могут быть перекрыты. То есть написав такой класс:
Class MyClass:
def __and__(self, right_argument):
result = 'что угодно'
print(f'Фигасе: {self} & {right_argument} -> {result}')
return result
a = MyClass()
b = MyClass()
print('Вот так вот:\n', a & b)
Фигасе: <__main__.MyClass object at 0x7f3df1aeb588> & <__main__.MyClass object at 0x7f3df1aeb438> -> что угодно
Вот так вот:
что угодно
pandas использует перекрытие, чтобы, фактически, сформировать функцию, которая будет применяться потом к большому количеству аргументов по очереди. Само собой логические операции для этого не годятся.
Я просто уверен, что автор вопроса не поймёт до конца то, что я тут объяснял, но, возможно, кому-то пригодится.
Удручает, что люди не хотят учиться, а хотят сразу быть готовыми программистами и писать в прод.