2016-09-08 4 views
1

Я пытаюсь использовать булевую маску, чтобы получить соответствие из двух разных фреймов. UЛогическое ИЛИ/побитовое ИЛИ в pandas Кадр данных

Используя логический оператор ИЛИ:

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(). 

Однако с помощью оператора ИЛИ, результаты возвращаются успешно.

x = df[(df['A'].isin(df2['B'])) 
     | df['A'].isin(df2['C'])] 

Output: x 

Есть ли разница в обоих и побитовое ИЛИ быть лучшим вариантом здесь? Почему логическое ИЛИ не работает?

+3

Да, это в основном потому, что логично или не может быть перегружено. – ayhan

+0

Привет, мой вопрос. Мне просто очень интересно, почему логические ORs не работают. – BernardL

+0

Вы сравниваете массивы, а не скалярные значения, которые 'или' не понимают, поэтому нужно использовать побитовое '' '. – jezrael

ответ

2

Насколько я понял эту проблему (исходя из фона 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 в зависимости от внутреннего механизма, чтобы определить это.

Это в основном тот же принцип, что и для всех других операторов (>, <,> =, < =, ==,! =).

Зачем нужна борьба и использование другого выражения &, когда вы получили приятное и аккуратное «и»? Это похоже на то, что «и» просто закодировано и не может быть изменено вручную.

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

+0

Спасибо! Извините за поздний ответ, объяснение явно нарушает его. Дает понимание о том, что происходит под капотом. – BernardL