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

298

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
0
372
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

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

8
  • 1
    de que biblioteca np.nanviene? No puedo usarloCaffeineConnoisseur 5 de agosto de 2016 a las 22:33
  • 10
    @CaffeineConnoisseur: import numpy as np. John Zwinck 8 de agosto de 2016 a las 21:56
  • 44
    @CaffeineConnoisseur - o simplemente pd.np.nansi no quieres import numpytambién. elPastor 12/10/2017 a las 1:27
  • 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 usando elpd.DataFrame.from_dict(eval(_string_))yeliabsalohcin 7 de agosto de 2018 a las 11:02
  • 6
    También es útil mencionar la ... inplace=Trueopción. smci 24 de mayo de 2019 a las 23:02
476
df = df.fillna('')

o solo

df.fillna('', inplace=True)

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

Si desea llenar una sola columna, puede usar:

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

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

4
  • 12
    @Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')elPastor 12/10/2017 a las 1:29
  • 1
    Se trata de darmeSettingWithCopyWarningjss367 11/11/20 a las 22:44
  • 2
    @ jss367 Eso no se debe a este código, sino a que anteriormente creó una vista parcial de un df más grande. Muy buena respuesta aquí stackoverflow.com/a/53954986/3427777fantabolous 26 de ene a las 11:54
  • Tengo curiosidad por saber por qué str(np.nan)no devuelve una cadena vacía, lo que me parece el resultado lógico. Estoy seguro de que tiene algo que ver con el funcionamiento interno de la fábrica de embutidos. ¿Alguien puede señalarme una buena explicación? JJL 24 de junio a las 22:14
128

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

  • 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('')
3
  • na_filter no está disponible en read_excel () pandas.pydata.org/pandas-docs/stable/…Marjorie Roswell 31/07/2017 a las 2:39
  • 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 1 de agosto de 2017 a las 6:40
  • Funciona, lo estoy usando en parsexl.parse('sheet_name', na_filter=False)Dmitrii 22/11/2017 a las 17:33
10

Utilice un formateador, si solo desea formatearlo para que se muestre bien cuando se imprima . Simplemente use df.to_string(... formatterspara definir un 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
3
  • 4
    print df.fillna('')por sí mismo (sin hacerlo df = df.fillna('')) tampoco modifica el original. ¿Tiene alguna ventaja la velocidad u otra ventaja to_string? fantabolous 27/11/18 a las 3:10
  • ¡Muy bien, df.fillna('')lo es! Steve Schulist 28/11/18 a las 15:35
  • @shadowtalker: No necesariamente, solo 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 ahorrando 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 24 de mayo de 2019 a las 23:05
3

Prueba esto,

agregar inplace=True

import numpy as np
df.replace(np.NaN, '', inplace=True)
1
  • Esta no es una cadena vacía ''y ' 'no son equivalentes. Mientras que la primera se trata como False, el valor utilizado anteriormente se tratará como True. suvayu 28 abr a las 9:26
2

el uso keep_default_na=False debería ayudarlo a:

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

Si está convirtiendo DataFrame a JSON, NaNdará un error, por lo que la mejor solución en este caso de uso es reemplazar NaNcon None.
Aquí es cómo:

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

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

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

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

Para eliminar el nan y completar algunos valores:

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

También probé df.iloc. pero necesita el índice de la columna. por lo que debe volver a mirar dentro de la mesa. simplemente el método anterior se redujo en un paso.