web-dev-qa-db-fra.com

Remplacement de Pandas ou Numpy Nan par None à utiliser avec MysqlDB

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?

86
Rishi

@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).

143
Andy Hayden
df = df.replace({pd.np.nan: None})

Le mérite revient à ce gars ici sur question de Github .

34
EliadL

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'>
15
bogatron

Après avoir trébuché, cela a fonctionné pour moi:

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

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)
1
Robin Nemeth

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.

0
YaOzI