Estoy tratando de escribir un marco de datos Pandas (o puedo usar una matriz numpy) en una base de datos mysql usando MysqlDB. MysqlDB no parece entender 'nan' y mi base de datos arroja un error que dice que nan no está en la lista de campos. Necesito encontrar una manera de convertir el 'nan' en un NoneType.
¿Algunas ideas?
python
pandas
numpy
mysql-python
Rishi
fuente
fuente
None
enNULL
lugar denan
?Respuestas:
@bogatron tiene razón, puede usarlo
where
, vale la pena señalar que puede hacer esto de forma nativa en pandas:Nota: esto cambia el dtype de todas las columnas a
object
.Ejemplo:
Nota: lo que no puede hacer es refundir los DataFrames
dtype
para permitir todos los tipos de tipos de datos, usandoastype
, y luego elfillna
método DataFrame :Desafortunadamente, ni esto, ni el uso
replace
, funcionan conNone
ver este problema (cerrado) .Como acotación al margen, vale la pena señalar que para la mayoría de los casos de uso no es necesario reemplazar NaN con None, consulte esta pregunta sobre la diferencia entre NaN y None en pandas .
Sin embargo, en este caso específico parece que sí (al menos en el momento de esta respuesta).
fuente
np.nan
se convierta en una cadena"nan"
dtype
deobject
y hacerlo por esas y manejar otros tipos de manera diferente según sea necesario. Idealmente,fillna(None)
sería fantástico.El crédito es para este tipo por este problema de Github .
fuente
df.replace({np.nan: None})
como objeto temporalPuede reemplazar
nan
conNone
en su matriz numpy:fuente
dtype
,x.dtype
esdtype('float64')
, mientrasy.dtype
esdtype('object')
.Después de tropezar, esto funcionó para mí:
fuente
Solo una adición a la respuesta de @Andy Hayden:
Dado que
DataFrame.mask
es el gemelo opuesto deDataFrame.where
, tienen exactamente la misma firma pero con un significado opuesto:DataFrame.where
es útil para reemplazar valores donde la condición es falsa .DataFrame.mask
se utiliza para Reemplazar valores donde la condición es Verdadera .Entonces, en esta pregunta, el uso
df.mask(df.isna(), other=None, inplace=True)
podría ser más intuitivo.fuente
Otra adición: tenga cuidado al reemplazar múltiplos y convertir el tipo de columna de objeto a flotante . Si quieres estar seguro de que tu
None
's no cambiará anp.NaN
' s, aplica la sugerencia de @ andy-hayden con usingpd.where
. Ilustración de cómo la sustitución aún puede salir 'mal':fuente
.replace({np.nan: None})
replace({np.nan: None})
. Mi comentario se agregó para señalar el posible error al reemplazarnp.nan
. ¡Lo anterior ciertamente me hizo tropezar un poco!Bastante viejo, pero me encontré con el mismo problema. Intente hacer esto:
fuente