Trabajar con datos NaN en dataframe

abril 03, 2015

nan en dataframe

Trabajar con datos NaN en dataframe

Se crea un dataframe con datos vacíos para generar los NaN, en este caso se agregan datos tipo None a la lista, que es el equivalente a leer un archivo de Excel o de un csv en los que faltan valores.

In [1]:
import pandas as pd

df = pd.DataFrame({'a':[None, 3, None, 5, 6], 'b':[1, 3, 4, 6, None], 'c':[54, None, None, 32, 21]})
print df
    a   b   c
0 NaN   1  54
1   3   3 NaN
2 NaN   4 NaN
3   5   6  32
4   6 NaN  21

[5 rows x 3 columns]

Reconocer los valores NaN

Con este comando devuelve una tabla booleana con True si el valor es un NaN o False si no lo es.

In [2]:
df_bool = pd.isnull(df)
print df_bool
       a      b      c
0   True  False  False
1  False  False   True
2   True  False   True
3  False  False  False
4  False   True  False

[5 rows x 3 columns]

Eliminar todos los NaN del dataframe

Este comando elimina todas las filas que contengan un valor NaN

In [3]:
df_sin_nan = df.dropna(how='any')
print df_sin_nan
   a  b   c
3  5  6  32

[1 rows x 3 columns]

Rellenar NaN del dataframe

Asignando un valor

Es posible dar un valor específico a los NaN. En la siguiente línea se reemplazan todos los NaN por 3

In [4]:
df_nuevo = df.fillna(value=3)
print df_nuevo
   a  b   c
0  3  1  54
1  3  3   3
2  3  4   3
3  5  6  32
4  6  3  21

[5 rows x 3 columns]

Reemplazar los NaN con el valor promedio de cada columna:

In [5]:
df_nuevo = df.fillna(df.mean())
print df_nuevo
          a    b          c
0  4.666667  1.0  54.000000
1  3.000000  3.0  35.666667
2  4.666667  4.0  35.666667
3  5.000000  6.0  32.000000
4  6.000000  3.5  21.000000

[5 rows x 3 columns]

Con los valores vecinos

Reemplazar los NaN con el valor anterior o posterior del NaN: 'pad' para reemplazarlo con el valor anterior y 'bfill' con el posterior. Se reemplazan todos los NaN, pero se puede establecer un límite según la distancia de este con el último dato del dataframe. Esta distancia se especifica en limit:

In [6]:
df_nuevo = df.fillna(method='bfill', limit=1)
print df_nuevo
   a   b   c
0  3   1  54
1  3   3 NaN
2  5   4  32
3  5   6  32
4  6 NaN  21

[5 rows x 3 columns]

Sin el límite:

In [7]:
df_nuevo = df.fillna(method='pad')
print df, '\n'
print df_nuevo
    a   b   c
0 NaN   1  54
1   3   3 NaN
2 NaN   4 NaN
3   5   6  32
4   6 NaN  21

[5 rows x 3 columns] 

    a  b   c
0 NaN  1  54
1   3  3  54
2   3  4  54
3   5  6  32
4   6  6  21

[5 rows x 3 columns]

Interpolando

Para reemplazar los NaN interpolando con el resto de datos conocidos se usa la función interpolate:

In [8]:
df_inter = df.interpolate(method='linear')
print df_inter
    a  b          c
0 NaN  1  54.000000
1   3  3  46.666667
2   4  4  39.333333
3   5  6  32.000000
4   6  6  21.000000

[5 rows x 3 columns]

Otros métodos de interpolación
method : ‘linear’, ‘time’, ‘index’, ‘values’, ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘barycentric’, ‘krogh’, ‘polynomial’, ‘spline’ ‘piecewise_polynomial’, ‘pchip’.

You Might Also Like

0 comments

Apoyado por: