Prefacio esto con la declaración de que yo no haría esto en primer lugar y que me encontré con esto ayudando a un amigo.
Considere el marco de datos df
df = pd.DataFrame(pd.Series([[1.2]])) df 0 0 [1.2]Este es un marco de datos de objetos donde los objetos son listas. En el código de mi amigo, tenían:
df.astype(float)Que se rompe como esperaba
ValueError: setting an array element with a sequence.
Sin embargo, si esos valores fueran matrices numpy en su lugar:
df = pd.DataFrame(pd.Series([np.array([1.2])])) df 0 0 [1.2]Y probé lo mismo:
df.astype(float) 0 0 1.2Es lo suficientemente feliz como para hacer algo y convertir mis matrices de 1 longitud en escalares. ¡Esto se siente muy sucio!
Si en cambio no fueran arreglos de 1 longitud
df = pd.DataFrame(pd.Series([np.array([1.2, 1.3])])) df 0 0 [1.2, 1.3]luego se rompe
ValueError: setting an array element with a sequence.
Pregunta
Por favor, dime que esto es un error y podemos solucionarlo. ¿O alguien puede explicar por qué y en qué mundo esto tiene sentido?
Respuesta a @root
Tienes razón. ¿Esto vale la pena? ¿Esperas/quieres esto?
a = np.empty((1,), object) a[0] = np.array([1.2]) a.astype(float) array([ 1.2])Y
a = np.empty((1,), object) a[0] = np.array([1.2, 1.3]) a.astype(float)ValueError: setting an array element with a sequence.
Esto se debe al valor predeterminado unsafe para el argumento de astype casting En los documentos , la casting de argumentos se describe como tal:
"Controla qué tipo de conversión de datos puede ocurrir. El valor predeterminado es 'inseguro' para compatibilidad con versiones anteriores". (énfasis mío)
Cualquiera de las otras conversiones posibles devuelve un TypeError .
a = np.empty((1,), object) a[0] = np.array([1.2]) a.astype(float, casting='same_kind')Resultados en:
TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'same_kind' Esto es cierto para todas las conversiones excepto para unsafe , a saber: no , equiv , safe y same_kind .