J'essaie d'écrire un Pandas dataframe (ou peut utiliser un tableau numpy) dans une base de données mysql à l'aide de MysqlDB. MysqlDB ne semble pas comprendre 'nan' et ma base de données jette une erreur en disant "nan". n'est pas dans la liste des champs. Je dois trouver un moyen de convertir le "nan" en un NoneType.
Des idées?
@bogatron a raison, vous pouvez utiliser where
, il est intéressant de noter que vous pouvez le faire de manière native dans les pandas:
df1 = df.where((pd.notnull(df)), None)
Note: ceci change le type de de toutes les colonnes en object
.
Exemple:
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
Remarque: ne pouvez pas refondre les DataFrames dtype
pour autoriser tous les types de types de données, à l'aide de astype
, puis de DataFrame fillna
méthode:
df1 = df.astype(object).replace(np.nan, 'None')
Malheureusement, ni cela, ni utiliser replace
, fonctionne avec None
voir ce problème (fermé) . =
En passant, il convient de noter que dans la plupart des cas d'utilisation, il n'est pas nécessaire de remplacer NaN par None. Voir cette question à propos de la différence entre NaN et None dans les pandas .
Cependant, dans ce cas spécifique, il semble que vous le fassiez (du moins au moment de cette réponse).
df = df.replace({pd.np.nan: None})
Le mérite revient à ce gars ici sur question de Github .
Vous pouvez remplacer nan
par None
dans votre tableau 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])
<type 'NoneType'>
Après avoir trébuché, cela a fonctionné pour moi:
df = df.astype(object).where(pd.notnull(df),None)
Assez vieux, mais je suis tombé sur le même problème. Essayez de faire ceci:
df['col_replaced'] = df['col_with_npnans'].apply(lambda x: None if np.isnan(x) else x)
Juste un ajout à la réponse de @Andy Hayden:
Puisque DataFrame.mask
est le jumeau opposé de DataFrame.where
, ils ont exactement la même signature mais avec une signification opposée:
DataFrame.where
Est utile pour Remplacer des valeurs pour lesquelles la condition est False .DataFrame.mask
Est utilisé pour Remplacer les valeurs pour lesquelles la condition est Vrai .Donc, dans cette question, utiliser df.mask(df.isna(), other=None, inplace=True)
pourrait être plus intuitif.