Вопрос:
Я пытаюсь использовать булевскую маску, чтобы получить соответствие из двух разных фреймов. U
Использование логического оператора OR:
x = df[(df[‘A’].isin(df2[‘B’])) or df[‘A’].isin(df2[‘C’])] Output: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Однако, используя побитовый оператор OR, результаты возвращаются успешно.
x = df[(df[‘A’].isin(df2[‘B’])) | df[‘A’].isin(df2[‘C’])] Output: x
Есть ли разница в обоих и побитовое ИЛИ будет лучшим вариантом здесь? Почему логическое ИЛИ не работает?
Лучший ответ:
Насколько я понял эту проблему (начиная с фона C++ и в настоящее время изучая Python для наук о данных), я наткнулся на несколько сообщений, предполагающих, что побитовые операторы (&, |) могут быть перегружены в классах, подобно [CN10 ] делает.
Таким образом, в основном, хотя вы можете использовать такие побитовые операторы на числах, они будут сравнивать биты и дать вам результат. Например, если у вас есть следующее:
1 | 2 # приведет к 3
На самом деле Python будет сравнивать бит этих чисел:
00000001 | 00000010
Результатом будет:
00000011 (потому что 0 | 0 – False, ergo 0 и 0 | 1 – True, ergo 1)
В качестве целого числа: 3
Он сравнивает каждый бит чисел и выплевывает результат этих восьми последовательных операций. Это нормальное поведение этих операторов.
Введите Pandas. Поскольку вы можете перегружать этих операторов, Pandas воспользовался этим. Итак, какие побитовые операторы делают, когда приходят в pandas dataframes, следующее:
(dataframe1 [‘column’] == “выражение”) & (dataframe1 [‘column’]! = “другое выражение)
В этом случае первые панды создадут серию истин или фальсов в зависимости от результата операций == и! = (Будьте осторожны: вам нужно поместить фигурные скобки вокруг внешних выражений, потому что python всегда будет пытаться разрешить первые побитовые операторы и ТОГДА другие сравнительные операторы !!). Поэтому он сравнивает каждое значение в столбце с выражением и выводит значение true или false.
Тогда у вас будет две одинаковые серии истин и фальши. То, что он делает, это взять эти две серии и в основном сравнить их с “и” (&) или “или” (|), и, наконец, выплюнуть одну серию, выполнив или не выполнив все три операции сравнения.
Чтобы пойти еще дальше, я думаю, что это происходит под капотом, так это то, что & -operator на самом деле называет функцию панд, дает им как предварительно оцененные операции (поэтому два ряда слева и справа от оператора), так и панды сравнивает два разных значения за раз, возвращая значение True или False в зависимости от внутреннего механизма для определения этого.
Это в основном тот же принцип, который они использовали и для всех других операторов (>, <,> =, <=, ==,! =).
Зачем бороться и использовать разные и -expression, когда вы получили красивое и аккуратное “и”? Это похоже на то, что “и” просто закодировано и не может быть изменено вручную.
Надеюсь, это поможет!