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 .

0voto

Sourav Dey Points 1

Cela devrait fonctionner

df.loc[df.Variable == '', 'Variable'] = 'Value'

ou

df.loc[df.Variable1 == '', 'Variable2'] = 'Value'

0voto

David Kong Points 378

Ce n'est pas une solution élégante, mais ce qui semble fonctionner, c'est l'enregistrement au format XLSX, puis la réimportation. Les autres solutions proposées sur cette page n'ont pas fonctionné pour moi, je ne sais pas pourquoi.

data.to_excel(filepath, index=False)
data = pd.read_excel(filepath)

-3voto

ERIC Points 28

Vous pouvez aussi utiliser un filtre pour le faire.

df = PD.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '])
    df[df=='']='nan'
    df=df.astype(float)

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