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