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

NoneenNULLlugar 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
dtypepara permitir todos los tipos de tipos de datos, usandoastype, y luego elfillnamétodo DataFrame :Desafortunadamente, ni esto, ni el uso
replace, funcionan conNonever 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.nanse convierta en una cadena"nan"dtypedeobjecty 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
nanconNoneen su matriz numpy:fuente
dtype,x.dtypeesdtype('float64'), mientrasy.dtypeesdtype('object').Después de tropezar, esto funcionó para mí:
fuente
Solo una adición a la respuesta de @Andy Hayden:
Dado que
DataFrame.maskes el gemelo opuesto deDataFrame.where, tienen exactamente la misma firma pero con un significado opuesto:DataFrame.wherees útil para reemplazar valores donde la condición es falsa .DataFrame.maskse 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