Насколько я понял эту проблему (исходя из фона C++ и изучая Python для наук о данных), я наткнулся на несколько сообщений о том, что побитовые операторы (&, |) могут быть перегружены в классах, C++ делает.
Так что, в основном, если вы можете использовать такие побитовые операторы для чисел, они будут сравнивать биты и давать результат. Так, например, если у вас есть следующее:
1 | 2 # will result in 3
Что Python будет на самом деле сделать это сравнить биты этих чисел:
00000001 | 00000010
Результат будет:
00000011 (потому что 0 | 0 ложна, эрго 0 и 0 | 1 Правда, эрго 1)
Как целое число: 3
Он сравнивает каждый бит чисел и выплевывает результат этих восьми последовательных операций. Это нормальное поведение этих операторов.
Введите Pandas. Поскольку вы можете перегружать этих операторов, Pandas воспользовался этим. Так что битовые операторы делают, когда приходят к пандам dataframes, заключаются в следующем:
(dataframe1['column'] == "expression") & (dataframe1['column'] != "another expression)
В этом случае, во-первая панде создать серию истин или falses в зависимости от результата == и = операции (! будьте осторожны: вам нужно поместить фигурные скобки вокруг внешних выражений, потому что python всегда будет пытаться разрешить первые побитовые операторы, а THEN - другие операторы сравнения !!). Поэтому он сравнивает каждое значение в столбце с выражением и выводит значение true или false.
Тогда у вас будет две одинаковые серии истин и фальши. То, что он делает, это взять эти две серии и в основном сравнить их с «и» (&) или «или» (|), и, наконец, выплюнуть одну серию, выполнив или не выполнив все три операции сравнения.
Чтобы идти дальше, то, что я думаю, происходит под капотом, заключается в том, что & -оператор фактически вызывает функцию pandas, дает им обе ранее оцененные операции (поэтому два ряда слева и справа от оператора) и pandas затем сравнивает два разных значения за раз, возвращая True или False в зависимости от внутреннего механизма, чтобы определить это.
Это в основном тот же принцип, что и для всех других операторов (>, <,> =, < =, ==,! =).
Зачем нужна борьба и использование другого выражения &, когда вы получили приятное и аккуратное «и»? Это похоже на то, что «и» просто закодировано и не может быть изменено вручную.
Надеюсь, что это поможет!
Да, это в основном потому, что логично или не может быть перегружено. – ayhan
Привет, мой вопрос. Мне просто очень интересно, почему логические ORs не работают. – BernardL
Вы сравниваете массивы, а не скалярные значения, которые 'или' не понимают, поэтому нужно использовать побитовое '' '. – jezrael