Para borrar valores nulos de una columna en específico usamos el subset=[“Name_column”] dentro del dropna
Librerías de manipulación de datos con Python
¿Por qué NumPy y Pandas?
NumPy
NumPy Array
Tipos de datos
Dimensiones
Creando arrays
Shape y Reshape
Funciones principales de NumPy
Copy
Condiciones
Operaciones
Quiz: NumPy
Pandas
Series y DataFrames en Pandas
Leer archivos CSV y JSON con Pandas
Filtrado con loc y iloc
Agregar o eliminar datos con Pandas
Manejo de datos nulos
Filtrado por condiciones
Funciones principales de Pandas
groupby
Combinando DataFrames
Merge y Concat
Join
Pivot y Melt
Apply
Quiz: Pandas
Cierre
Posibilidades con Pandas y NumPy
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Los datos nulos son dolores de cabeza para este mundo de la ciencia de datos y se van a encontrar mucho en nuestros DataFrames
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
df.isnull()
----> Col1 Col2 Col3
0 false false false
1 false true false
2 false false false
3 true false true
df.isnull()*1
---> Col1 Col2 Col3
0 0 0 0
1 0 1 0
2 0 0 0
3 1 0 1
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
df.fillna(df.mean())
----> Col1 Col2 Col3
0 1 4 a
1 2 5.667 b
2 3 6 c
3 2 7 None
df.interpolate()
----> Col1 Col2 Col3
0 1 4 a
1 2 5 b
2 3 6 c
3 3 7 None
df.dropna()
---> Col1 Col2 Col3
0 1 4 a
2 3 6 c
Contribución creada por: Edward Giraldo.
Aportes 43
Preguntas 5
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
df.dropna(thresh=3)
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
df.isnull()
----> Col1 Col2 Col3
0 false false false
1 false true false
2 false false false
3 true false true
df.isnull()*1
----> Col1 Col2 Col3
0 0 0 0
1 0 1 0
2 0 0 0
3 1 0 1
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
df.fillna(df.mean())
----> Col1 Col2 Col3
0 1 4 a
1 2 5.667 b
2 3 6 c
3 2 7 None
df.interpolate()
----> Col1 Col2 Col3
0 1 4 a
1 2 5 b
2 3 6 c
3 3 7 None
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:
df.isnull().sum()
>>>
col_1 1
col_2 1
col_3 1
dtype: int64
df.fillna(method='bfill')
df.fillna(method='ffill')
df.dropna(how='all')
df.dropna(thresh=2)
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
df.dropna(thresh=2)
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:
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.
(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)]
En series de tiempo es importante manejar nulos, por ejemplo, el método fillna tiene varias formas de usarse:
df['colum'].fillna(method='ffill')
.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.
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()
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)
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:
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?