238 votes

Remplacement des valeurs vides (espace blanc) par NaN dans pandas

Je veux trouver toutes les valeurs dans un cadre de données Pandas qui contiennent des espaces (n'importe quelle quantité arbitraire) et remplacer ces valeurs par des NaN.

Avez-vous des idées sur la façon d'améliorer cette situation ?

En gros, je veux tourner ça :

                   A    B    C
2000-01-01 -0.532681  foo    0
2000-01-02  1.490752  bar    1
2000-01-03 -1.387326  foo    2
2000-01-04  0.814772  baz     
2000-01-05 -0.222552         4
2000-01-06 -1.176781  qux     

Dans ça :

                   A     B     C
2000-01-01 -0.532681   foo     0
2000-01-02  1.490752   bar     1
2000-01-03 -1.387326   foo     2
2000-01-04  0.814772   baz   NaN
2000-01-05 -0.222552   NaN     4
2000-01-06 -1.176781   qux   NaN

J'ai réussi à le faire avec le code ci-dessous, mais c'est vraiment moche. Ce n'est pas Python et je suis sûr que ce n'est pas non plus l'utilisation la plus efficace de pandas. Je boucle à travers chaque colonne et je fais un remplacement booléen par rapport à un masque de colonne généré en appliquant une fonction qui fait une recherche regex de chaque valeur, avec correspondance sur les espaces.

for i in df.columns:
    df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None

On pourrait l'optimiser un peu en n'itérant que sur les champs qui peuvent contenir des chaînes vides :

if df[i].dtype == np.dtype('object')

Mais ce n'est pas une grande amélioration

Et enfin, ce code définit les chaînes cibles à None, ce qui fonctionne avec les fonctions de Pandas telles que fillna() mais ce serait bien, par souci d'exhaustivité, de pouvoir insérer un fichier NaN directement au lieu de None .

7voto

Gil Baggio Points 2137

La plus simple de toutes les solutions :

df = df.replace(r'^\s+$', np.nan, regex=True)

4voto

Ted Petrou Points 20559

Pour une solution très rapide et simple où vous vérifiez l'égalité par rapport à une seule valeur, vous pouvez utiliser la fonction mask méthode.

df.mask(df == ' ')

2voto

spen.smith Points 21

Ces solutions sont toutes proches de la bonne réponse, mais je ne dirais pas qu'aucune ne résout le problème tout en restant la plus lisible pour les autres qui lisent votre code. Je dirais que cette réponse est une combinaison de Réponse de BrenBarn et le commentaire de tuomasttik en dessous de cela réponse . La réponse de BrenBarn utilise isspace builtin, mais ne supporte pas la suppression des chaînes vides, comme le demande OP, et j'aurais tendance à attribuer cela comme le cas d'utilisation standard du remplacement des chaînes par null.

Je l'ai réécrit avec .apply de sorte que vous pouvez l'appeler sur un pd.Series o pd.DataFrame .


Python 3 :

Pour remplacer les chaînes de caractères vides ou les chaînes de caractères contenant entièrement des espaces :

df = df.apply(lambda x: np.nan if isinstance(x, str) and (x.isspace() or not x) else x)

Pour remplacer des chaînes entièrement constituées d'espaces :

df = df.apply(lambda x: np.nan if isinstance(x, str) and x.isspace() else x)

Pour l'utiliser dans Python 2, vous devrez remplacer str con basestring .

Python 2 :

Pour remplacer les chaînes de caractères vides ou les chaînes de caractères contenant entièrement des espaces :

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and (x.isspace() or not x) else x)

Pour remplacer des chaînes entièrement constituées d'espaces :

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

2voto

sambrowne Points 21

Cela a fonctionné pour moi. Lorsque j'ai importé mon fichier csv, j'ai ajouté na_values = ' '. Les espaces ne sont pas inclus dans les valeurs NaN par défaut.

df= pd.read_csv(filepath,na_values = ' ')

2voto

Jayantha Points 463
print(df.isnull().sum()) # check numbers of null value in each column

modifiedDf=df.fillna("NaN") # Replace empty/null values with "NaN"

# modifiedDf = fd.dropna() # Remove rows with empty values

print(modifiedDf.isnull().sum()) # check numbers of null value in each column

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X