Pandas Reemplazar NaN con una cadena en blanco / vacía

218

Tengo un marco de datos de Pandas como se muestra a continuación:

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

Quiero eliminar los valores de NaN con una cadena vacía para que se vea así:

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

Respuestas:

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

Esto puede ayudar. Reemplazará todos los NaN con una cadena vacía.

nEO
fuente
1
¿De qué biblioteca np.nanviene? No puedo usarlo
CaffeineConnoisseur
8
@CaffeineConnoisseur: import numpy as np.
John Zwinck
26
@CaffeineConnoisseur, o solo pd.np.nansi no quieres hacerlo import numpytambién.
elPastor
1
Esto también permite que el Dict se guarde como una cadena en la fila de un .csv y luego se vuelva a leer en un DataFrame utilizando elpd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin
55
También es útil mencionar la ... inplace=Trueopción.
smci
341
df = df.fillna('')

o solo

df.fillna('', inplace=True)

Esto llenará de na (por ejemplo, NaN) ''.

Si desea llenar una sola columna, puede usar:

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

Uno puede usar en df['column1']lugar de df.column1.

fantabolous
fuente
55
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor
99

Si está leyendo el marco de datos de un archivo (por ejemplo, CSV o Excel), use:

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

Esto considerará automáticamente los campos vacíos como cadenas vacías. ''


Si ya tiene el marco de datos

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')
Natesh Bhat
fuente
na_filter no está disponible en read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell
Lo he usado en mi aplicación. Existe, pero por alguna razón, no han dado este argumento en los documentos. Funciona bien para mí, aunque sin errores.
Natesh bhat
Funciona, lo estoy usando en análisisxl.parse('sheet_name', na_filter=False)
Dmitrii
5

Utilice un formateador, si solo desea formatearlo para que se vea bien cuando se imprima . Solo use el df.to_string(... formatterspara definir el formato de cadena personalizado, sin modificar innecesariamente su DataFrame o desperdiciar 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)})

Llegar:

   A B       C
0  a      read
1  b 1  unread
2  c      read
Steve Schulist
fuente
44
print df.fillna('')por sí mismo (sin hacer df = df.fillna('')) tampoco modifica el original. ¿Hay una velocidad u otra ventaja de usar to_string?
fantástico
¡Muy bien, df.fillna('')lo es!
Steve Schulist
@shadowtalker: No necesariamente, sería la respuesta correcta si el OP quisiera mantener el df en un formato (por ejemplo, más eficiente desde el punto de vista computacional, o guardar memoria en cadenas innecesarias / vacías / duplicadas), pero renderizarlo visualmente en un formato más manera agradable Sin saber más sobre el caso de uso, no podemos decirlo con certeza.
smci
2

Prueba esto,

añadir inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)
Vineesh TP
fuente
1

usar keep_default_na=False debería ayudarte a:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
fuente
0

Si está convirtiendo trama de datos a JSON, NaNdará error para mejor solución es el uso en este caso es reemplazar NaNcon None.
Aquí es cómo:

df1 = df.where((pd.notnull(df)), None)
Dinesh Khetarpal
fuente
0

Intenté con una columna de valores de cadena con nan.

Para eliminar el nan y llenar la cadena vacía:

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

Para eliminar el nan y llenar algunos valores:

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

Intenté df.iloc también. pero necesita el índice de la columna. así que debes mirar hacia la mesa nuevamente. simplemente el método anterior redujo un paso.

Subbu VidyaSekar
fuente