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 43

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para borrar valores nulos de una columna en específico usamos el subset=[“Name_column”] dentro del dropna

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
			  		

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

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=‘all’ / 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=[‘col1’,‘col2’] / Elimina valores nulos basado en las columnas específicas declaradas en el subset df.dropna(subset=['col1'])

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

Mis apuntes #16


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=[“Columna”])

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.

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.

Porcentaje de elementos nulos

(df.isnull().sum() / len(df)) * 100

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 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 ‘Col 1’ no sería muy acertado usarlo puesto que repite el dato anterior.

hacer "*fillna"* a solo una columna `df.fillna({"col1":df["col1"].mean()}, inplace=True)`

Me alegra seguir aprendiendo del uso de pandas. Mas la eliminacion de valores nulos que sera muy util en el desarrollo de nuestro conocimiento de data-science.

.fillna() & .interpolate()

## 🦄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

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