Comment remplacer les valeurs par None dans le cadre de données Pandas en Python?

Existe-t-il une méthode pour remplacer les valeurs par None dans les Pandas en Python?

, Vous pouvez utiliser df.replace('pre', 'post') et peut remplacer une valeur par une autre, mais cela ne peut être fait si vous voulez remplacer par None valeur, qui, si vous essayez, vous obtenez un résultat étrange.

Voici donc un exemple:

df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)

Qui renvoie un résultat réussi.

Mais,

df.replace('-', None)

Qui renvoie le résultat suivant:

0
0   - // this isn't replaced
1   3
2   2
3   5
4   1
5  -5
6  -1
7  -1 // this is changed to `-1`...
8   9

Pourquoi un résultat aussi étrange - ils de retour?

Puisque je veux verser ce cadre de données dans la base de données MySQL, Je ne peux pas mettre des valeurs NaN dans aucun élément de mon cadre de données et je veux plutôt mettre None. Sûrement, vous pouvez d'abord le changement '-' à NaN, puis de convertir NaN à None, mais je veux savoir pourquoi le dataframe agit d'une terrible façon.

48
demandé sur Blaszard 2013-06-14 01:17:31

3 réponses

En fait, dans les versions ultérieures de pandas, Cela donnera une TypeError:

df.replace('-', None)
TypeError: If "to_replace" and "value" are both None then regex must be a mapping

, Vous pouvez le faire en passant une liste ou un dictionnaire:

In [11]: df.replace('-', df.replace(['-'], [None]) # or .replace('-', {0: None})
Out[11]:
      0
0  None
1     3
2     2
3     5
4     1
5    -5
6    -1
7  None
8     9

Mais je recommande d'utiliser NaNs plutôt que None:

In [12]: df.replace('-', np.nan)
Out[12]:
     0
0  NaN
1    3
2    2
3    5
4    1
5   -5
6   -1
7  NaN
8    9
64
répondu Andy Hayden 2013-06-13 21:29:01

where est probablement ce que vous cherchez. Donc

data=data.where(data=='-', None) 

À partir des documents panda :

where [renvoie] un objet de même forme que self et dont les entrées correspondantes proviennent de self où cond est True et sinon d'other).

13
répondu user2966041 2014-04-09 21:38:12

J'ai trouvé la solution à l'aide de replace avec un dict la plus simple et la solution élégante:

df.replace({'-': None})

Vous pouvez également avoir plus de remplacements:

df.replace({'-': None, 'None': None})

Et même pour les remplacements plus importants, il est toujours évident et clair ce qui est remplacé par quoi - ce qui est beaucoup plus difficile pour les longues listes, à mon avis.

10
répondu Michael Dorner 2018-09-22 15:36:19