O lógico / bitwise OR en el dataframe pandas

Estoy tratando de usar una máscara booleana para obtener una coincidencia de 2 marcos de datos diferentes. U

Usando el operador OR lógico:

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

Sin embargo, utilizando el operador OR a nivel de bits, los resultados se devuelven correctamente.

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

¿Hay una diferencia entre ambos y sería B bit o sería la mejor opción aquí? ¿Por qué no funciona el OR lógico?

Por lo que he llegado a entender este problema (proveniente de un fondo de C ++ y actualmente estoy aprendiendo Python para ciencias de datos), me topé con varias publicaciones que sugieren que los operadores de bit a bit (&, |) pueden sobrecargarse en clases, al igual que C ++.

Básicamente, mientras que puedes usar dichos operadores bitwise en números, compararán los bits y te darán el resultado. Así, por ejemplo, si tiene lo siguiente:

1 | 2 # resultará en 3

Lo que Python realmente hará es comparar los bits de estos números:

00000001 | 00000010

El resultado será:

00000011 (porque 0 | 0 es falso, ergo 0; y 0 | 1 es verdadero, ergo 1)

Como un entero: 3

Compara cada bit de los números y escupe el resultado de estas ocho operaciones consecutivas. Este es el comportamiento normal de estos operadores.

Entra Pandas. Como puedes sobrecargar a estos operadores, Pandas ha hecho uso de esto. Entonces, ¿qué hacen los operadores bitwise al llegar a los marcos de datos de pandas?

(dataframe1 [‘column’] == “expresión”) & (dataframe1 [‘column’]! = “otra expresión)

En este caso, los primeros pandas crearán una serie de pistas o falsas dependiendo del resultado de las operaciones == y! = ( Tenga cuidado: debe colocar llaves alrededor de las expresiones externas porque Python siempre intentará resolver los primeros operadores a nivel de bits y ENTONCES los otros operadores de comparación !! ). Por lo tanto, comparará cada valor de la columna con la expresión y generará un verdadero o un falso.

Entonces tendrías dos series iguales de pistas y falsas. Lo que hace THEN es tomar estas dos series y, básicamente, compararlas con “y” (&) o “o” (|), y finalmente escupir una sola serie que cumpla o no las tres operaciones de comparación.

Para ir aún más lejos, lo que creo que está sucediendo bajo el capó es que el operador & realmente llama a una función de pandas, les da ambas operaciones evaluadas previamente (de modo que las dos series a la izquierda y la derecha del operador) y pandas se comparan dos valores distintos a la vez, devolviendo un Verdadero o Falso dependiendo del mecanismo interno para determinar esto.

Este es básicamente el mismo principio que han usado para todos los demás operadores también (>, <,> =, <=, ==,! =).

¿Por qué la lucha y el uso de una & expresión diferente cuando obtienes el agradable y ordenado “y”? Bueno, eso parece ser porque “y” está codificado y no puede modificarse manualmente.

¡Espero que ayude!