¿Cómo puedo reemplazar todos los valores de NaN con cero en una columna de un dataframe de pandas?

Tengo un dataframe como abajo

itm Date Amount 67 420 2012-09-30 00:00:00 65211 68 421 2012-09-09 00:00:00 29424 69 421 2012-09-16 00:00:00 29877 70 421 2012-09-23 00:00:00 30990 71 421 2012-09-30 00:00:00 61303 72 485 2012-09-09 00:00:00 71781 73 485 2012-09-16 00:00:00 NaN 74 485 2012-09-23 00:00:00 11072 75 485 2012-09-30 00:00:00 113702 76 489 2012-09-09 00:00:00 64731 77 489 2012-09-16 00:00:00 NaN 

cuando bash aplicar una función a la columna Cantidad, aparece el siguiente error.

 ValueError: cannot convert float NaN to integer 

He intentado aplicar una función utilizando .isnan del módulo matemático. He probado el atributo pandre .replace. Probé el atributo .sparse data de pandas 0.9 También probé si NaN == statement de NaN en una función. También he mirado este artículo ¿Cómo reemplazo los valores de NA por ceros en un dataframe R? Mientras miro algunos otros artículos. Todos los métodos que he intentado no han funcionado o no reconocen NaN. Cualquier consejo o solución sería apreciado.

Creo que DataFrame.fillna() hará esto por ti.

Enlace a Docs para un dataframe y para una serie .

Ejemplo:

 In [7]: df Out[7]: 0 1 0 NaN NaN 1 -0.494375 0.570994 2 NaN NaN 3 1.876360 -0.229738 4 NaN NaN In [8]: df.fillna(0) Out[8]: 0 1 0 0.000000 0.000000 1 -0.494375 0.570994 2 0.000000 0.000000 3 1.876360 -0.229738 4 0.000000 0.000000 

Para completar los NaN en una sola columna, seleccione solo esa columna. en este caso, estoy usando inplace = True para cambiar realmente el contenido de df.

 In [12]: df[1].fillna(0, inplace=True) Out[12]: 0 0.000000 1 0.570994 2 0.000000 3 -0.229738 4 0.000000 Name: 1 In [13]: df Out[13]: 0 1 0 NaN 0.000000 1 -0.494375 0.570994 2 NaN 0.000000 3 1.876360 -0.229738 4 NaN 0.000000 

No se garantiza que la división devuelva una vista o una copia. Tu puedes hacer

 df['column'] = df['column'].fillna(value) 

Solo quería proporcionar un poco de actualización / caso especial ya que parece que la gente todavía viene aquí. Si está utilizando un índice múltiple o, de lo contrario, utiliza un segmentador de datos, la opción inplace = True puede no ser suficiente para actualizar la división que ha elegido. Por ejemplo, en un índice múltiple de 2×2, esto no cambiará ningún valor (a partir de los pandas 0.15):

 idx = pd.IndexSlice df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True) 

El “problema” es que el encadenamiento rompe la capacidad de relleno para actualizar el dataframe original. Pongo el “problema” entre comillas porque hay buenas razones para las decisiones de diseño que llevaron a no interpretar a través de estas cadenas en ciertas situaciones. Además, este es un ejemplo complejo (aunque realmente lo encontré), pero lo mismo puede aplicarse a menos niveles de índices dependiendo de cómo se corte.

La solución es DataFrame.update:

 df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0)) 

Es una línea, se lee razonablemente bien (más o menos) y elimina cualquier interferencia innecesaria con variables intermedias o bucles, ¡mientras que le permite aplicar fillna a cualquier sector de niveles múltiples que desee!

Si alguien puede encontrar lugares en los que esto no funciona, por favor publique en los comentarios, he estado jugando con él y mirando la fuente y parece que al menos soluciono mis problemas de división de índice múltiple.

Podría usar replace para cambiar NaN a 0 :

 import pandas as pd import numpy as np # for column df['column'] = df['column'].replace(np.nan, 0) # for whole dataframe df = df.replace(np.nan, 0) # inplace df.replace(np.nan, 0, inplace=True) 

El siguiente código funcionó para mí.

 import pandas df = pandas.read_csv('somefile.txt') df = df.fillna(0) 

Una forma fácil de llenar los valores que faltan: –

Rellenar columnas de cadena: cuando las columnas de cadena tienen valores perdidos y valores de NaN.

 df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True) 

Relleno de columnas numéricas: cuando las columnas numéricas tienen valores perdidos y valores NaN.

 df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True) 

llenando NaN con cero:

 df['column name'].fillna(0, inplace = True) 

introduzca la descripción de la imagen aquí

Teniendo en cuenta la columna particular, la Amount en la tabla anterior es de tipo entero. La siguiente sería una solución:

 df['Amount'] = df.Amount.fillna(0).astype(int) 

De forma similar, puede rellenarlo con varios tipos de datos como float , str , etc.

En particular, consideraría el tipo de datos para comparar varios valores de la misma columna.

Para reemplazar los valores de na en los pandas.

 df['column_name'].fillna(value_to_be_replaced,inplace=True) 

si inplace = False , en lugar de actualizar el df (dataframe) devolverá los valores modificados.