Panda Sostituire NaN con stringa vuota / vuota


219

Ho un Dataframe Pandas come mostrato di seguito:

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

Voglio rimuovere i valori NaN con una stringa vuota in modo che appaia così:

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

Risposte:


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

Questo potrebbe aiutare. Sostituirà tutti i NaN con una stringa vuota.


1
da quale biblioteca np.nanviene? Non posso usarlo
CaffeineConnoisseur

8
@CaffeineConnoisseur: import numpy as np.
John Zwinck,

26
@CaffeineConnoisseur - o solo pd.np.nanse non lo desideri import numpy.
elPastor,

1
Ciò consente inoltre al Dict di essere salvato come stringa nella riga di un .csv e successivamente di rileggerlo in un DataFrame utilizzandopd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin il

5
Utile anche per menzionare l' ... inplace=Trueopzione.
smci,

343
df = df.fillna('')

o solo

df.fillna('', inplace=True)

Questo riempirà di na (es. NaN) con ''.

Se vuoi riempire una singola colonna, puoi usare:

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

Si può usare al df['column1']posto di df.column1.


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

99

Se stai leggendo il frame di dati da un file (ad esempio CSV o Excel), utilizza:

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

Ciò considererà automaticamente i campi vuoti come stringhe vuote ''


Se hai già il frame di dati

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

na_filter non è disponibile su read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell

l'ho usato nella mia applicazione. Esiste ma per qualche ragione, non hanno fornito questo argomento nei documenti. Funziona bene per me, anche se senza errori.
Natesh bhat,

Funziona, lo sto usando in analisixl.parse('sheet_name', na_filter=False)
Dmitrii,

5

Usa un formatter, se vuoi solo formattarlo in modo da renderlo bene quando viene stampato . Basta usare il df.to_string(... formattersper definire la formattazione personalizzata delle stringhe, senza modificare inutilmente DataFrame o sprecare memoria:

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

Ottenere:

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

4
print df.fillna('')da solo (senza farlo df = df.fillna('')) non modifica neanche l'originale. C'è una velocità o un altro vantaggio nell'uso to_string?
fantabolous

Abbastanza giusto, df.fillna('')lo è!
Steve Schulist,

@shadowtalker: Non necessariamente, sarebbe la risposta corretta solo se l'OP volesse mantenere il df in un formato (ad es. più efficiente dal punto di vista computazionale o risparmiare memoria su stringhe inutili / vuote / duplicate), ma renderlo visivamente in un altro modo piacevole. Senza sapere di più sul caso d'uso, non possiamo dirlo con certezza.
smci,

2

Prova questo,

Inserisci inplace=True

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

1

l'utilizzo keep_default_na=False dovrebbe aiutarti:

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

0

Se stai convertendo DataFrame in JSON, NaNfornirà un errore, quindi la soluzione migliore in questo caso d'uso è sostituirla NaNcon None.
Ecco come:

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

0

Ho provato con una colonna di valori stringa con nan.

Per rimuovere il nan e riempire la stringa vuota:

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

Per rimuovere il nan e riempire alcuni valori:

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

Ho provato anche df.iloc. ma ha bisogno dell'indice della colonna. quindi devi guardare di nuovo nel tavolo. semplicemente il metodo sopra ha ridotto di un passo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.