En Python puro, None or True devuelve True .
Sin embargo, con pandas cuando estoy haciendo un | entre dos series que contienen valores Ninguno, los resultados no son los que esperaba:
>>> df.to_dict() {'buybox': {0: None}, 'buybox_y': {0: True}} >>> df buybox buybox_y 0 None True >>> df['buybox'] = (df['buybox'] | df['buybox_y']) >>> df buybox buybox_y 0 False TrueResultado Esperado:
>>> df buybox buybox_y 0 True TrueObtengo el resultado que quiero al aplicar la operación OR dos veces, pero no entiendo por qué debo hacer esto.
No estoy buscando una solución alternativa (lo tengo aplicando df['buybox'] = (df['buybox'] | df['buybox_y']) dos veces seguidas) pero una explicación, por lo tanto, el 'por qué' En el título.
pandas | El operador no se basa en Python or expression y se comporta de manera diferente.
Si ambos operandos son booleanos, el resultado se define matemáticamente, y lo mismo para Python y Pandas.
Pero en su caso, la serie "buybox" es de tipo object y "buybox_y" es bool . En este caso Pandas | El operador no es conmutativo :
bitwise or se intentaNone | True es una operación no válida, lo que da como resultado NonePor lo tanto,
>>> df['buybox'] | df['buybox_y'] 0 False >>> df['buybox_y'] | df['buybox'] 0 True Para obtener resultados predecibles, puede limpiar los datos y convertirlos en tipo booleano con Pandas astype antes de intentar operaciones booleanas.
Para objetos booleanos (es decir, Py_True y Py_False), el código entrará en la rama de procesamiento rápido; para otros objetos, se usará PyObject_IsTrue() para calcular un valor de tipo int.
Durante el proceso de cálculo, la función PyObject_IsTrue() obtendrá a su vez los valores de nb_bool, mp_length y sq_length, que deberían corresponder a los valores de retorno de los dos métodos mágicos bool () y len ().