No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Manejo de datos nulos

15/24
Recursos

Los datos nulos son dolores de cabeza para este mundo de la ciencia de datos y se van a encontrar mucho en nuestros DataFrames

  • Creamos un DataFrame con algunos valores nulos
import pandas as pd
import numpy as np

dict = {'Col1':[1,2,3,np.nan],
'Col2':[4, np.nan,6,7],
'Col3':['a','b','c', None]}
df = pd.DataFrame(dict)
---> Col1 Col2 Col3
0   1       4    a
1   2     nan    b
2   3       6    c
3  nan      7   None
  • Identificar valores nulos en un DataFrame
df.isnull()
---->    Col1   Col2   Col3
0       false   false  false
1       false   true   false
2       false   false  false
3       true    false  true
  • Identificar valores nulos con un valor num茅rico
df.isnull()*1
---> Col1   Col2   Col3
0       0      0       0
1       0      1       0
2       0      0       0
3       1      0       1
  • Sustituir los valores nulos por una cadena
df.fillna('Missing')
--->  Col1   Col2   Col3
0       1.0    4.0     a
1       2.0  Missing   b
2       3.0    6.0     c
3       Missing 7.0  Missing		
  • Sustituir valores nulos por una medida estad铆stica realizada con los valores de las columnas
df.fillna(df.mean())
---->    Col1   Col2   Col3
0           1      4      a
1           2      5.667  b
2           3      6      c
3           2      7     None
  • Sustituir valores nulos por valores de interpolaci贸n
df.interpolate()
---->    Col1   Col2   Col3
0           1      4      a
1           2      5      b
2           3      6      c
3           3      7     None	  
  • Eliminar valores nulos
df.dropna()
--->  Col1   Col2   Col3
0       1      4      a
2       3      6      c

Contribuci贸n creada por: Edward Giraldo.

Aportes 38

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Para borrar valores nulos de una columna en espec铆fico usamos el subset=[鈥淣ame_column鈥漖 dentro del dropna

El m茅todo para reemplazar nulos de interpolaci贸n visto en clase es muy interesante. Tiene variados argumentos que la hacen muy poderosa.
Algunos son:
METHOD: m茅todo usado par interpolar. Por default es el linear. Pero existen otros:

  • Time: para interpolar entre intervalos de tiempo.
  • Index: reemplaza el nulo por el valor del index.
  • Pad: reemplaza el nulo por alg煤n valor existente en el dataframe.
  • Se puede especificar que la interpolaci贸n sea cuadr谩tica, c煤bica , polin贸mica, entre otros.
  • Se puede especificar que se reemplace por el cero, o el valor contiguo m谩s cercano, entre otros.

AXIS: tiene 3 opciones:

  • En direcci贸n de los index (axis = 0).
  • En direcci贸n de las columnas (axis = 1).
  • None: ninguna. Esta es la opci贸n default.

LIMIT (opcional) : el n煤mero m谩ximo de NULOS consecutivos que se pueden reemplazar. Tiene que ser mayor a cero.
LIMIT_DIRECTION (opcional): idem anterior pero en alguna direcci贸n. Puede ser:

  • Forward: hacia adelante.
  • Backward: hacia atr谩s.
  • Both: ambos.

FUENTE : https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.interpolate.html

Para aquellos que se pregunten que diferencia hay entre NaN, None y NaT:

  • NaN: si una columna es de tipo num茅rico y falta alg煤n valor, ese valor ser谩 NaN (Not a Number). Como curiosidad, NaN es de tipo float y, por tanto, si tienes una columna de enteros y hay un valor que falta, autom谩ticamente toda esa columna pasa a ser de tipo float debido al NaN (se hace upcasting a cada valor).

  • NAT: si tienes una columna de tipo DateTime y falta alg煤n valor, ese ser谩 NaT (Not a Time).

  • None: cuando tenemos una columna de tipo object (el tipo de los strings). Aunque para estas columnas podr铆amos encontrar cualquiera de los 3: None, NaN y NaT.

Nota aparte: np.NaN == np.NaN devuelve False, al igual que pd.NaT == pd.NaT devuelve False. Sin embargo, ```
None == None



Retorna los row que tenga almenos 3 not-nan

df.dropna(thresh=3)

Manejo de valores nulos

  • Creamos un dataFrame con algunos valores nulos
import pandas as pd
import numpy as np

dict = {'Col1':[1,2,3,np.nan],
'Col2':[4, np.nan,6,7],
'Col3':['a','b','c', None]}

df = pd.DataFrame(dict)
	----> Col1 Col2 Col3
			0   1    4   a
			1   2   nan  b
			2   3    6   c
			3  nan   7  None
  • Identificar valores nulos en un dataFrame
df.isnull()
---->    Col1   Col2   Col3
			0 false   false  false
			1 false   true   false
			2 false   false  false
			3 true    false  true
  • Identificar valores nulos con un valor numerico
df.isnull()*1
---->    Col1   Col2   Col3
			0   0      0       0
			1   0      1       0
			2   0      0       0
			3   1      0       1
  • Sustituir los valores nulos por una cadena
df.fillna('Missing')
---->    Col1   Col2   Col3
	    0  1.0    4.0     a
			1  2.0  Missing   b
			2  3.0    6.0     c
			3 Missing 7.0  Missing		
  • Sustituir valores nulos por una medida estadisticas realizada con los valores de las columnas
df.fillna(df.mean())
---->    Col1   Col2   Col3
      0   1      4      a
			1   2      5.667  b
			2   3      6      c
			3   2      7     None	    		
  • Sustituir valores nulos por valores de interpolacion
df.interpolate()
---->    Col1   Col2   Col3
      0   1      4      a
			1   2      5      b
			2   3      6      c
			3   3      7     None	    		
  • Eliminar valores nulos
df.dropna()
---->    Col1   Col2   Col3
      0   1      4      a
			2   3      6      c
			  		

Al asignar la media a los valores nulos, esta se obtiene por columna, no del dataset completo

df1.fillna(df1.mean())

Col1 Col2 Col3
0 1.0 5.0 a
1 2.0 NaN b
2 3.0 6.0 c
3 NaN 7.0 None

Col1 Col2 Col3
0 1.0 5.0 a
1 2.0 6.0 b
2 3.0 6.0 c
3 2.0 7.0 None

Comparto otros posibles approaches con estas funciones de manejo de datos nulos:

Contar valores nulos por columnas:

df.isnull().sum()
>>>
col_1    1
col_2    1
col_3    1
dtype: int64

Metodos de llenado para fillna( )

  • bfill / Rellena los datos tomando como base los valores posteiores de la serie, df.fillna(method='bfill')
  • ffill / Rellena los datos tomando como base los valores anteriores de la serie. df.fillna(method='ffill')

Parpametros para dropna( )

  • how=鈥榓ll鈥 / elimina los valores nulos si los hay en toda la fila df.dropna(how='all')
  • thresh=# / elimina valores nulos si hay almenos el numero delcarado de NaNs df.dropna(thresh=2)
  • subset=[鈥榗ol1鈥,鈥榗ol2鈥橾 / Elimina valores nulos basado en las columnas espec铆ficas declaradas en el subset df.dropna(subset=['col1'])

De todas manera como parte de un departamento de datos, no es solo borrar hay que analizar la informaci贸n, verificarla y ver el posible impacto de eliminar datos, en mi opini贸n es mejor buscar una soluci贸n de llenado, dado de si son muchos es mejor buscar el origen y corregirlo

df.notnull() -----> Para idenntificar los datos no nulos
df.isnull().any() ----------> Para saber si en la Base de datos hay nulos
df[df.notnull()] Nos regresa NaN donde son nulos

df.dropna(thresh=2) 
  • elimina la cantidad de valores nulos con las filas.

Hay que tener en cuenta que cuando se utiliza la funci贸n .dropna(), lo que hace es borrar aquellas filas que contienen un valor nulo.

Pero si solo se quiere tener en cuenta los valores nulos de una columna hay que pasarle el nombre de la columna .dropna(subset=[鈥淐olumna鈥漖)

Diferencias entre NaN y None:

  • NaN es un Not a Number que maneja Numpy para valores nulos y con el cual se puede operar con argumentos de las funciones que ofrece la librer铆a Numpy como interpolate()
  • None es para valores nulos tipo texto y no tiene la misma operabilidad con que NaN con la libreria Numpy

Aqu铆 explican un poco mas detallado las diferencias:
https://qastack.mx/programming/17534106/what-is-the-difference-between-nan-and-none

Para trabajar con decimales ( definidos a nuestras necesidades) es buena idea agregar esta linea de c贸digo al inicio de nuestro .ipynb

De acuerdo a la documentaci贸n de pandas, estas son algunas ( no se si todas) las opciones disponibles.

https://pandas.pydata.org/pandas-docs/stable/user_guide/options.html

En caso de llenar valores nulos, recomiendo usar .median(). Con .mean() los valores pueden estar sesgados

Esta clase me VOLO la cabeza. Es ideal para todos las pruebas t茅cnicas que mandan para trabajos en DS. Ahora y m谩s que nunca hasta el FINAL.

Mis apuntes #16


Para detectar r谩pidamente filas con valor nulo en cualquiera de sus columnas podemos usar el m茅todo any():

df[df.isnull().any(axis=1)]

Uso de fillna para series de tiempo

En series de tiempo es importante manejar nulos, por ejemplo, el m茅todo fillna tiene varias formas de usarse:

  1. Poner un valor en concreto para todos los nulos como un string o la media, no lo recomiendo para series de tiempo.
  2. Relleno frontal, donde hay un nulo pone el valor siguiente de la serie de tiempo df['colum'].fillna(method='ffill').
  3. Relleno anterios, donde hay un nulo pone el valor anterior de la serie de tiempo df['colum'].fillna(method='bfill').

df.interpolate ( ) = interpolar
Significa que promedia el valor anterior y posterior al dato nulo.
Muy similar a una serie pero en datos finales como en 鈥楥ol 1鈥 no ser铆a muy acertado usarlo puesto que repite el dato anterior.

Les comento, que la versi贸n actual de Pandas (la 2.13) me arroja un error del tama帽o mamut al emitirle el comando `df.fillna(df.mean()).` Entre la reta铆la de l铆neas con problemas, la 煤ltima dice as铆: > TypeError: can only concatenate str (not "int") to str Por lo que esta parte de la pr谩ctica hay que hacerla de otra manera.
## 馃Manejo de Datos Nulos Los datos nulos son conocidos como valores faltantes o ausentes. Son datos que no est谩n disponibles por diversas razones como errores en la recopilaci贸n, p茅rdida de informaci贸n o simplemente falta de respuesta de los usuarios. Por suerte, Pandas nos ofrece muchas utilidades para trabajar con los datos nulos. * Creamos un DataFrame con algunos valores nulos. `import pandas as pd` `import numpy as np` `dict = {'Col1':[1,2,3,np.nan],` `'Col2':[4, np.nan,6,7],` `'Col3':['a','b','c', None]}` `df = pd.DataFrame(dict)` `---> Col1 Col2 Col3` `0 1 4 a` `1 2 nan b` `2 3 6 c` `3 nan 7 None` 鈥 Identificamos valores nulos en un DataFrame. `df.isnull()` `----> Col1 Col2 Col3` `0 false false false` `1 false true false` `2 false false false` `3 true false true` * Identificamos los valores nulos con un valor num茅rico. `df.isnull()*1` `---> Col1 Col2 Col3` `0 0 0 0` `1 0 1 0` `2 0 0 0` `3 1 0 1` * Sustituimos los valores nulos por una cadena. df.fillna('Missing') `---> Col1 Col2 Col3` `0 1.0 4.0 a` `1 2.0 Missing b` `2 3.0 6.0 c` `3 Missing 7.0 Missing` * Sustituimos los valores nulos por una medida estad铆stica realizada con los valores de las columnas. `df.fillna(df.mean())` `----> Col1 Col2 Col3` `0 1 4 a` `1 2 5.667 b` `2 3 6 c` `3 2 7 None` * Sustituimos los valores nulos por valores de interpolaci贸n. `df.interpolate()` `----> Col1 Col2 Col3` `0 1 4 a` `1 2 5 b` `2 3 6 c` `3 3 7 None` 鈥 Eliminar valores nulos `df.dropna()` `---> Col1 Col2 Col3` `0 1 4 a` `2 3 6 c`
**馃挕La interpolaci贸n** La interpolaci贸n es un m茅todo matem谩tico que podemos usar para **estimar valores desconocidos** dentro de un rango desconocido de datos observados o medidos. Podemos usar la interpolaci贸n para predecir valores intermedios de puntos desconocidos. Nos es muy 煤til en el d铆a a d铆a como cient铆ficos de datos.

Contar la cantidad de datos nulos que hay por cada variable:

df.isnull().sum()

El error que est谩ba teniendo con df.fillna(df.mean()) se debe a que estaba intentando calcular la media de un DataFrame que contiene columnas con diferentes tipos de datos (n煤meros enteros y cadenas de texto). La funci贸n fillna() no puede realizar el c谩lculo de la media en columnas con tipos de datos no num茅ricos.

Para solucionar este problema, puedes realizar el c谩lculo de la media solo en las columnas num茅ricas y luego aplicar la funci贸n fillna() solo a esas columnas.

# Calcula la media solo en las columnas num茅ricas
numeric_cols = df.select_dtypes(include=np.number)
mean_values = numeric_cols.mean()

# Rellena los valores nulos con la media en las columnas num茅ricas
df[numeric_cols.columns] = numeric_cols.fillna(mean_values)

# Imprime el DataFrame actualizado
df

Con este c贸digo, calcular谩s la media solo en las columnas num茅ricas y luego reemplazar谩s los valores nulos en esas columnas con la media correspondiente. De esta manera, evitas el error de concatenaci贸n de tipos de datos.

nota:
dict es una palabra reservada de python, cuando le asignamos un valor la estmos sobreescribiendo y borrando lo que originalmente contiene, solo es para tenerlo en cuenta

Cuando aplica el metodo 鈥.isnull()鈥

Es interesante probar el siguiente:

df.isnull().sum()

Des esta forma nos dara la cantidad de valores nulos dentro de cada columna.

Para los metodos que manejo de datos Nulos o NA, tambi茅n se puede aplicar la sentencia inplace = True para que se puedan aplicar al DataFrame

df.fillna('Missing', inplace = True)
df.dropna(inplace = True)

15. Manejo de datos nulos

import pandas as pd
import numpy as np

dict={'Col1':[1,2,3,np.nan],
 'Col2':[4,np.nan,6,7],
 'Col3':['a','b','c',None]}

df = pd.DataFrame(dict)
df

df.isnull() # Devuelve los booleanos de si son nulos o no

df.isnull()*1

df.fillna('Missing') # reemplaza los nulos por Missing

df.fillna(df.mean()) # reemplaza los nulos con la media, pero se puede llenar con el campo que quiera

df.interpolate() # Reemplaza los datos interpolando la serie

df.dropna() # elimina los nulos

La funci贸n df.dropna( ) debe utilizarse con precauci贸n ya que puede eliminar informaci贸n importante de las filas eliminadas, ya que puede que no todas las mismas columnas con mismas filas tengan valores nulos.

Con el metodo interpolate hay que tener cuidado porque no puede predecir el valor null de la primera fila, por tanto seria conveniente quizas rellenarlo con un doble interpolate:

df.T.interpolate().T.interpolate()
df.interpolate().T.interpolate().T

Los dos arrojan resultados ligeramente diferentes, aunque estoy mas conforme con los del segundo

Manejo de datos nulos
Es muy usual que los datos que recibamos no est茅n completos por alguna raz贸n y ser谩 necerario manejar estas excepciones antes de procesar los datos. Para ello Pandas nos ofrece una serie de m茅todos:

  • dropna() 鈫 borra los datos nulos, esta es la opci贸n recomendable siempre y cuando no haya muchos valores nulos
  • fllna(val) 鈫 reemplaza los valores nulos por un valor que puede ser la media, la moda u otro valor que veamos por conveniente
  • interpolate() 鈫 funciona solo con datos num茅ricos, interpola los valores del df como si fuera una serie consecutiva
import pandas as pd
import numpy as np
dict={'Col1':[1,2,3,np.nan],
'Col2':[4, np.nan,6 ,7],
'Col3':['a','b','c',None]
}
df=pd.DataFrame(dict)
df

Col1 Col2 Col3
0 1.0 4.0 a
1 2.0 NaN b
2 3.0 6.0 c
3 NaN 7.0 None

df.isnull()

Col1 Col2 Col3
0 False False False
1 False True False
2 False False False
3 True False True


Col1	Col2	Col3
0	False	False	False
1	False	True	False
2	False	False	False
3	True	False	True 

Tambien puedes elegir las columnas a las cuales quieres aplicarle el m茅todo dropna as铆:

df.dropna(subset=['Col2','Col1'])

Informaci贸n resumida de esta clase
#EstudiantesDePlatzi

  • Los datos nulos o datos incompletos es un problema que debemos saber manejar

  • Los datos nulos aparecen con demasiada frecuencia en nuestros datasets

  • Cuando trabajamos con tensores en redes neuronales, estos tipos de datos nulos, es mejor trabajarlos con un m茅todo num茅rico

  • En ocasiones, depende del proyecto, estos valores nulos los debo rellenar con la media

  • Cuando el valor nulo es de tipo texto, depende del proyecto, lo debo rellenar con la moda o el valor que m谩s se repita

  • Con la funci贸n interp贸late, para manejar datos nulos de tipo num茅rico, esta funci贸n rellena los datos suponiendo una sucesi贸n, es otra manera de manejar los datos nulos

  • Si dentro de mi set de datos, tengo pocos datos nulos, puedo eliminarlos y trabajar con los que est谩n completos. Para esto utilizo la funci贸n drop

  • Los pasos para trabajar los datos nulos son: identificarlos, manejarlos, completarlos o eliminarlos

notas clase

Los datos nulos son dolores de cabeza para este mundo de la ciencia de datos y se van a encontrar mucho en nuestros DataFrames
Creamos un DataFrame con algunos valores nulos
________________________________________
[1]
0 s
import pandas as pd
import numpy as np
________________________________________
[2]
0 s
dict = {"col1":[1,2,3,np.nan],
 "col2":[4,np.nan,6,7],
 "col3":["a","b","c",None]}
 #creandon un dataset con diferentes valores, nulos, sin valor numerico entre otros 
________________________________________
[3]
0 s
dict = {'Col1':[1,2,3,np.nan],
'Col2':[4, np.nan,6,7],
'Col3':['a','b','c', None]}
________________________________________
[4]
0 s
df = pd.DataFrame(dict)
________________________________________
[5]
0 s
df
________________________________________
[6]
0 s
df.isnull()
#dentro de mi data set al aplicar null los datos nan dar谩n true 
________________________________________
[7]
df.isnull()*1
#cuando quiero filtrar los datos de for numerica, los valores true me daran en 1 
________________________________________
[8]
from pandas.core import missing
df.fillna("missing")
#con esta funcion fillna o llena los valores nulos, cada que ecuentre un valor nulo #
#lo llenara con missing, de esta forma puedo filatrar cualquier error que se encuentren en missing
#y descartarlos segun la demanda del proyecto en el que estes trabajando 
________________________________________
[9]
df.fillna(df.mean())
#aca nos da una peque帽a arvertencia, a los strin no les puedo sacar la media, que puede
#ser la media, m铆nima, persel50 entre otros valores  
________________________________________
df.fillna con este campo puedo decidir como llenar los campos nulos de un , es una buena manera para manejar valores nulos
________________________________________
[10]
df.interpolate()
#hay otra forma de llenar valores nulos hablando numericamente, los vaores string
#no los afectara y en los valores nulos los pone en serie con los demas, manejando 
#con valores m铆nimos y m谩ximos  
________________________________________
df.interpolate()
es una manera de manejar los valores nulos siempre que conozcamos que los datos est谩n de manera estructurada con una serie y frecuencia exacta. y si no es as铆 es mejor manejar un tipo de filtrado como es la mean, la moda
________________________________________
[11]
0 s
df.dropna()
#otra manera de manejar los datos nulos que muchos data Scintis lo manejan asi, dependiendo
#de la cantidad de datos nulos y es simplemete borrar los datos nulos  
________________________________________
el manejo de valores nulos que es un dolor de cabeza para los cient铆ficos de datos, saber manejar los datos null, identificar, completarlos o eliminarlos es una herramienta, que se utiliza bastante en el mundo de los datos