Python: cómo manejar los datos faltantes en Pandas DataFrame

En este tutorial, veremos cómo manejar los datos faltantes en un DataFrame de Pandas. Cubriremos la limpieza de datos, así como la eliminación y el llenado de valores utilizando la media, la moda, la mediana y la interpolación.

Introducción

pandas es una biblioteca de Python para el análisis y la manipulación de datos. Casi todas las operaciones en pandas giran en torno a DataFrames, una estructura de datos abstracta hecha a medida para manejar una tonelada métrica de datos.

En la tonelada métrica de datos antes mencionada, algunos de ellos seguramente faltarán por varias razones. Dando como resultado un valor faltante (null/None/Nan) en nuestro DataFrame.

Es por eso que, en este artículo, discutiremos cómo manejar los datos faltantes en un DataFrame de Pandas.

Inspección de datos {#inspección de datos}

Los conjuntos de datos del mundo real rara vez son perfectos. Pueden contener valores faltantes, tipos de datos incorrectos, caracteres ilegibles, líneas erróneas, etc.

El primer paso para cualquier análisis de datos adecuado es limpiar y organizar los datos que usaremos más adelante. Discutiremos algunos problemas comunes relacionados con los datos que pueden ocurrir en un conjunto de datos.

Trabajaremos con un conjunto de datos de empleados pequeños para esto. El archivo .csv se ve así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
First Name,Gender,Salary,Bonus %,Senior Management,Team
Douglas,Male,97308,6.945,TRUE,Marketing
Thomas,Male,61933,NaN,TRUE
Jerry,Male,NA,9.34,TRUE,Finance
Dennis,n.a.,115163,10.125,FALSE,Legal
,Female,0,11.598,,Finance
Angela,,,18.523,TRUE,Engineering
Shawn,Male,111737,6.414,FALSE,na
Rachel,Female,142032,12.599,FALSE,Business Development
Linda,Female,57427,9.557,TRUE,Client Services
Stephanie,Female,36844,5.574,TRUE,Business Development
,,,,,

Vamos a importarlo en un DataFrame:

1
2
df = pd.read_csv('out.csv')
df

Esto resulta en:

original dataframe pandas

Echando un vistazo más de cerca al conjunto de datos, notamos que Pandas asigna automáticamente NaN si el valor de una columna en particular es una cadena vacía '' NA o NaN. Sin embargo, hay casos en los que los valores faltantes se representan mediante un valor personalizado, por ejemplo, la cadena 'na' o 0 para una columna numérica.

Por ejemplo, la sexta fila tiene un valor de na para la columna Equipo, mientras que la quinta fila tiene un valor de 0 para la columna Salario.

Personalización de valores de datos faltantes

En nuestro conjunto de datos, queremos considerar estos como valores faltantes:

  1. Un valor 0 en la columna Salario
  2. Un valor na en la columna Equipo

Esto se puede lograr usando el argumento na_values para establecer valores faltantes personalizados. Este argumento representa un diccionario donde las claves representan un nombre de columna y el valor representa los valores de datos que se considerarán faltantes:

1
2
3
4
# This means that in Salary column, 0 is also considered a missing value.
# And 'na' is considered a missing value in the Team column.
df = pd.read_csv('out.csv', na_values={"Salary" : [0], "Team" : ['na']})
df

Esto resulta en:

customized df

Por otro lado, si queremos mapear una lista de valores que deben ser tratados como valores perdidos en todas las columnas, podemos pasar una lista de candidatos que queremos considerar globalmente como valores perdidos al parámetro na_values:

1
2
3
missing_values = ["n.a.","NA","n/a", "na", 0]
df = pd.read_csv('out.csv', na_values = missing_values)
df

Esto resulta en:

global missing values pandas

Tenga en cuenta que aquí, el valor de Gender en la cuarta fila también es NaN ahora que definimos n.a. como un valor faltante arriba.

Qué implementación elegir depende de la naturaleza del conjunto de datos.

Por ejemplo, es posible que algunas de las columnas numéricas del conjunto de datos deban tratar “0” como un valor faltante, mientras que otras columnas no. Por lo tanto, puede usar el primer enfoque en el que personaliza los valores faltantes en función de las columnas.

Del mismo modo, si queremos tratar 0, por ejemplo, como un valor faltante globalmente, podemos utilizar el segundo método y simplemente pasar una matriz de tales valores al argumento na_values.

Una vez que hayamos identificado todos los valores faltantes en el DataFrame y los hayamos anotado correctamente, hay varias formas de manejar los datos faltantes.

Eliminación de filas con valores faltantes

Un enfoque sería eliminar todas las filas que contienen valores faltantes. Esto se puede hacer fácilmente con la función dropna(), específicamente dedicada a esto:

1
2
# Drops all rows with NaN values
df.dropna(axis=0,inplace=True)

Esto resulta en:

drop nan values pandas

inplace = True realiza todos los cambios en el DataFrame existente sin devolver uno nuevo. Sin él, tendría que reasignar el DataFrame a sí mismo.

El argumento eje especifica si está trabajando con filas o columnas: 0 son filas y 1 son columnas.

Puede controlar si desea eliminar las filas que contienen al menos 1 NaN o todos los valores de NaN configurando el parámetro how en el método dropna.

cómo: {‘cualquiera’, ’todos’}

  • cualquiera: si hay algún valor NA presente, elimina esa etiqueta
  • todos: si todos los valores son NA, suelte esa etiqueta
1
df.dropna(axis=0,inplace=True, how='all')

Esto solo eliminaría la última fila del conjunto de datos, ya que how=all solo eliminaría una fila si faltan todos los valores de la fila.

De manera similar, para descartar columnas que contienen valores faltantes, simplemente establezca axis=1 en el método dropna.

Rellenar los valores que faltan

Puede que no sea el mejor enfoque eliminar las filas que contienen valores faltantes si dichas filas son abundantes. Pueden contener datos valiosos en otras columnas y no queremos sesgar los datos hacia un estado inexacto.

En este caso, tenemos varias opciones para asignar valores apropiados. Los más comunes se enumeran a continuación:

  • Rellene NA con la media, la mediana o la moda de los datos
  • Rellene NA con un valor constante
  • Relleno hacia adelante o Relleno hacia atrás NA
  • Interpolar datos y llenar NA

Repasemos estos uno por uno.

Rellene los valores del marco de datos que faltan con la media, la mediana y la moda de la columna

Empecemos con el método fillna(). Rellena los valores marcados como NA con los valores que proporciona al método.

Por ejemplo, puede usar las funciones .median(), .mode() y .mean() en una columna, y proporcionarlas como el valor de relleno:

1
2
3
4
5
6
7
8
# Using median
df['Salary'].fillna(df['Salary'].median(), inplace=True)
  
# Using mean
df['Salary'].fillna(int(df['Salary'].mean()), inplace=True)
  
# Using mode
df['Salary'].fillna(int(df['Salary'].mode()), inplace=True)

Ahora, si falta un salario en las filas de una persona, se utiliza una media, moda o mediana para completar ese valor. De esta manera, no eliminará a estas personas del conjunto de datos y tampoco distorsionará los valores salariales.

Si bien no es perfecto, este método le permite introducir valores que no afectan el conjunto de datos general, ya que no importa cuántos promedios agregue, el promedio permanece igual.

Rellenar los valores del marco de datos que faltan con una constante

También puede decidir llenar los valores marcados como NA con un valor constante. Por ejemplo, puede poner una cadena especial o un valor numérico:

1
df['Salary'].fillna(0, inplace=True)

Como mínimo, estos valores ahora son valores reales, en lugar de na o NaN.

Reenviar completar valores de marco de datos faltantes

Este método llenaría los valores faltantes con el primer valor no faltante que ocurre antes:

1
df['Salary'].fillna(method='ffill', inplace=True)

Rellenar hacia atrás los valores del marco de datos que faltan

Este método llenaría los valores faltantes con el primer valor no faltante que ocurre después:

1
df['Salary'].fillna(method='bfill', inplace=True)

Rellenar los valores del marco de datos que faltan con interpolación

Finalmente, este método utiliza la interpolación matemática para determinar qué valor habría estado en lugar de un valor faltante:

1
df['Salary'].interpolate(method='polynomial')

Conclusión

La limpieza y el preprocesamiento de datos es una parte muy importante de cada análisis de datos y cada proyecto de ciencia de datos.

En este artículo, revisamos varias técnicas para manejar los datos faltantes, que incluían personalizar los valores de los datos faltantes e imputar los valores de los datos faltantes usando diferentes métodos, incluidos la media, la mediana, la moda, un valor constante, relleno hacia adelante, relleno hacia atrás e interpolación.