J'essaye d'écrire un dataframe Pandas (ou je peux utiliser un tableau numpy) dans une base de données mysql en utilisant MysqlDB. MysqlDB ne semble pas comprendre «nan» et ma base de données renvoie une erreur disant que nan n'est pas dans la liste des champs. J'ai besoin de trouver un moyen de convertir le «nan» en NoneType.
Des idées?
python
pandas
numpy
mysql-python
Rishi
la source
la source
None
à laNULL
placenan
?Réponses:
@bogatron a raison, vous pouvez utiliser
where
, il convient de noter que vous pouvez le faire nativement dans les pandas:Remarque: cela change le dtype de toutes les colonnes en
object
.Exemple:
Remarque: ce que vous ne pouvez pas refondre les DataFrames
dtype
pour autoriser tous les types de types de données, en utilisantastype
, puis lafillna
méthode DataFrame :Malheureusement, ni cela, ni l'utilisation
replace
, ne fonctionne avecNone
voir ce problème (fermé) .En passant, il convient de noter que pour la plupart des cas d'utilisation, vous n'avez pas besoin de remplacer NaN par None, voir cette question sur la différence entre NaN et None dans les pandas .
Cependant, dans ce cas précis, il semble que vous le fassiez (du moins au moment de cette réponse).
la source
np.nan
être converti en chaîne"nan"
dtype
deobject
et de le faire pour celles-ci et de gérer les autres types différemment selon les besoins. Idéalement, cefillna(None)
serait formidable.Le mérite revient à ce gars ici sur ce problème Github .
la source
df.replace({np.nan: None})
comme objet temporaireVous pouvez remplacer
nan
parNone
dans votre tableau numpy:la source
dtype
,x.dtype
estdtype('float64')
, tout eny.dtype
estdtype('object')
.Après avoir trébuché, cela a fonctionné pour moi:
la source
Juste un ajout à la réponse de @Andy Hayden:
Puisqu'il
DataFrame.mask
s'agit du jumeau opposé deDataFrame.where
, ils ont exactement la même signature mais avec une signification opposée:DataFrame.where
est utile pour remplacer des valeurs où la condition est False .DataFrame.mask
est utilisé pour le remplacement des valeurs où la condition est True .Donc, dans cette question, l'utilisation
df.mask(df.isna(), other=None, inplace=True)
pourrait être plus intuitive.la source
Autre ajout: soyez prudent lors du remplacement des multiples et de la conversion du type de colonne d' objet en flottant . Si vous voulez être certain que votre
None
's ne reviendra pas ànp.NaN
' s appliquez @ andy-hayden's suggestion avec usingpd.where
. Illustration de la façon dont le remplacement peut toujours tourner mal:la source
.replace({np.nan: None})
replace({np.nan: None})
. Mon commentaire a été ajouté pour souligner le piège potentiel lors du remplacementnp.nan
de. Ce qui précède m'a certainement fait trébucher un peu!Assez vieux, mais je suis tombé sur le même problème. Essayez de faire ceci:
la source