Reemplazo de Pandas o Numpy Nan con un Ninguno para usar con MysqlDB

Estoy intentando escribir un dataframe de 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 diciendo que nan no está en la lista de campos. Necesito encontrar una manera de convertir el ‘nan’ en un Tipo de Ninguno.

¿Algunas ideas?

@bogatron tiene razón, puedes usar where , vale la pena señalar que puedes hacerlo de forma nativa en pandas:

 df1 = df.where((pd.notnull(df)), None) 

Nota: esto cambia el dtype de todas las columnas a object .

Ejemplo:

 In [1]: df = pd.DataFrame([1, np.nan]) In [2]: df Out[2]: 0 0 1 1 NaN In [3]: df1 = df.where((pd.notnull(df)), None) In [4]: df1 Out[4]: 0 0 1 1 None 

Nota: lo que no puede hacer una nueva dtype tipo de datos dtype para permitir todos los tipos de tipos de datos, utilizando astype , y luego el método DataFrame fillna :

 df1 = df.astype(object).replace(np.nan, 'None') 

Desafortunadamente, ni esto, ni el uso de replace , funciona con None Vea este problema (cerrado) .


Como nota aparte, vale la pena señalar que para la mayoría de los casos de uso no es necesario reemplazar NaN con None, vea 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).

Puede reemplazar nan por None en su matriz numpy:

 >>> x = np.array([1, np.nan, 3]) >>> y = np.where(np.isnan(x), None, x) >>> print y [1.0 None 3.0] >>> print type(y[1])  
 df = df.replace({pd.np.nan: None}) 

El crédito va a este tipo aquí en el tema Github .

Después de tropezar, esto me funcionó:

 df = df.astype(object).where(pd.notnull(df),None) 

Bastante viejo, sin embargo, me topé con el mismo problema. Intenta hacer esto:

 df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)