Логическое ИЛИ/побитовое ИЛИ в кадре данных pandas

Вопрос: Я пытаюсь использовать булевскую маску, чтобы получить соответствие из двух разных фреймов. 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

Вопрос:

Я пытаюсь использовать булевскую маску, чтобы получить соответствие из двух разных фреймов. 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, когда вы получили красивое и аккуратное “и”? Это похоже на то, что “и” просто закодировано и не может быть изменено вручную.

Надеюсь, это поможет!

Оцените статью
Добавить комментарий