Pandas Remplacer NaN par une chaîne vide / vide


218

J'ai un cadre de données Pandas comme indiqué ci-dessous:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Je veux supprimer les valeurs NaN avec une chaîne vide pour qu'elle ressemble à ceci:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

Réponses:


261
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Cela pourrait aider. Il remplacera tous les NaN par une chaîne vide.


1
de quelle bibliothèque np.nanvient-il? Je ne peux pas l'utiliser
CaffeineConnoisseur

8
@CaffeineConnoisseur: import numpy as np.
John Zwinck

26
@CaffeineConnoisseur - ou tout simplement pd.np.nansi vous ne le souhaitez pas import numpyaussi.
elPastor

1
Cela permet également d'enregistrer le Dict sous forme de chaîne dans la ligne d'un fichier .csv, puis de le relire ensuite dans un DataFrame à l'aide depd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin

5
Également utile de mentionner l' ... inplace=Trueoption.
smci

342
df = df.fillna('')

ou juste

df.fillna('', inplace=True)

Cela remplira les na (par exemple les NaN) avec ''.

Si vous souhaitez remplir une seule colonne, vous pouvez utiliser:

df.column1 = df.column1.fillna('')

On peut utiliser à la df['column1']place de df.column1.


5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

Si vous lisez la trame de données d'un fichier (par exemple CSV ou Excel), utilisez:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Cela considérera automatiquement les champs vides comme des chaînes vides ''


Si vous avez déjà la trame de données

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')

na_filter n'est pas disponible sur read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell

je l'ai utilisé dans ma candidature. Il existe mais pour une raison quelconque, ils n'ont pas donné cet argument dans la documentation. Cela fonctionne bien pour moi mais sans erreurs.
Natesh bhat

Cela fonctionne, je l'utilise en analysexl.parse('sheet_name', na_filter=False)
Dmitrii

5

Utilisez un formateur, si vous souhaitez uniquement le formater afin qu'il soit bien rendu lors de l'impression . Utilisez simplement le df.to_string(... formatterspour définir un formatage de chaîne personnalisé, sans modifier inutilement votre DataFrame ni gaspiller de mémoire:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Obtenir:

   A B       C
0  a      read
1  b 1  unread
2  c      read

4
print df.fillna('')par lui-même (sans le faire df = df.fillna('')) ne modifie pas l'original non plus. Y a-t-il une vitesse ou un autre avantage à utiliser to_string?
Fantabolous

Assez juste, df.fillna('')ça l'est!
Steve Schulist

@shadowtalker: Pas nécessairement, ce ne serait la bonne réponse que si l'OP voulait conserver le df dans un format (par exemple, plus efficace en termes de calcul, ou économiser de la mémoire sur des chaînes inutiles / vides / en double), tout en le rendant visuellement dans un format plus manière agréable. Sans en savoir plus sur le cas d'utilisation, nous ne pouvons pas en être sûrs.
smci

2

Essaye ça,

ajouter inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)

1

l'utilisation keep_default_na=False devrait vous aider:

df = pd.read_csv(filename, keep_default_na=False)

0

Si vous convertissez DataFrame en JSON, NaNl'erreur générera donc la meilleure solution est dans ce cas d'utilisation de remplacer NaNpar None.
Voici comment:

df1 = df.where((pd.notnull(df)), None)

0

J'ai essayé avec une colonne de valeurs de chaîne avec nan.

Pour supprimer le nan et remplir la chaîne vide:

df.columnname.replace(np.nan,'',regex = True)

Pour supprimer le nan et remplir certaines valeurs:

df.columnname.replace(np.nan,'value',regex = True)

J'ai également essayé df.iloc. mais il a besoin de l'index de la colonne. vous devez donc regarder à nouveau dans le tableau. la méthode ci-dessus a simplement réduit une étape.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.