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
user1452759
la source

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.

néo
la source
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.

fantabolique
la source
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('')
Natesh bhat
la source
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
Steve Schulist
la source
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)
Vineesh TP
la source
1

l'utilisation keep_default_na=False devrait vous aider:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
la source
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)
Dinesh Khetarpal
la source
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.

Subbu VidyaSekar
la source