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

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.


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.


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('')

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

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)

1

usar keep_default_na=False debería ayudarte a:

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

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)

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.