Valores Nulos y Duplicados¶
Valores Nulos¶
En Pandas, un valor nulo (o faltante) representa la ausencia de un valor en una celda específica de un DataFrame o una Serie. Los valores nulos pueden ocurrir por varias razones, como datos perdidos o no disponibles, errores de medición o problemas de entrada de datos.
Los valores nulos se representan en Pandas mediante el objeto NaN
(acrónimo de "Not a Number"). NaN
es un valor especial de punto flotante definido en el estándar IEEE para representar valores no definidos o indefinidos. En Pandas, los valores nulos se representan como NaN
para las Series y DataFrames que utilizan datos numéricos, y como None
para las Series y DataFrames que utilizan datos no numéricos.
Tipos de Valores Nulos¶
None
Es un objeto único de Python que a menudo se usa para datos faltantes en el código de Python. Debido a que es un objeto de Python, None
no se puede usar en ningún arreglo NumPy/Pandas arbitrario, sino solo en arreglos con el tipo de datos object
(es decir, arreglos de objetos de Python):
import pandas as pd
import numpy as np
vals1 = np.array([1, None, 3, 4])
vals1
array([1, None, 3, 4], dtype=object)
vals1.dtype
dtype('O')
Si realiza una operación como sum()
o min()
en un arreglo con None
, generalmente obtendrá un error:
# error
vals1.sum()
NaN
La otra representación de datos faltantes, NaN
(acrónimo de Not a Number), es diferente; es un valor de punto flotante especial reconocido por todos los sistemas que usan la representación de punto flotante estándar IEEE:
vals2 = np.array([1, np.nan, 3, 4])
vals2.dtype
dtype('float64')
Debe tener en cuenta que NaN
es como un virus de datos: infecta cualquier otro objeto que toca. Independientemente de la operación, el resultado de la aritmética con NaN
será otro NaN
:
1 + np.nan
nan
0 * np.nan
nan
vals2.sum(), vals2.min(), vals2.max()
(nan, nan, nan)
NaN y None en Pandas
NaN
y None
tienen su lugar, y Pandas está diseñado para manejarlos casi indistintamente, convirtiendo entre ellos cuando corresponda. Por otro lado, Pandas convierte automáticamente el valor None
en un valor NaN
.
Veamos un ejemplo:
s = pd.Series([1, np.nan, 2, None])
s
0 1.0 1 NaN 2 2.0 3 NaN dtype: float64
Operando con valores nulos¶
Para manipular los datos nulos en Pandas, se pueden utilizar varias funciones y métodos que permiten detectar, eliminar o rellenar valores nulos en un DataFrame o Serie. Algunas de las funciones y métodos más comunes son:
isnull()
: esta función devuelve una matriz booleana que indica qué valores son nulos en un DataFrame o Serie.notnull()
: esta función es el complemento de isnull(), y devuelve una matriz booleana que indica qué valores no son nulos en un DataFrame o Serie.dropna()
: este método elimina las filas o columnas que contienen al menos un valor nulo en un DataFrame.fillna()
: este método rellena los valores nulos en un DataFrame o Serie con un valor especificado.interpolate()
: este método rellena los valores nulos en un DataFrame o Serie mediante la interpolación lineal entre los valores no nulos.replace()
: este método permite reemplazar un valor específico, incluyendo valores nulos, con otro valor.
Por ejemplo, para manejar valores nulos en un DataFrame df, se podría utilizar el siguiente código:
# Crear un DataFrame con valores nulos
data = {'Nombre': ['Juan', 'María', 'Pedro', 'Ana', 'Luis'],
'Edad': [20, 30, np.nan, 25, 27],
'Género': ['M', 'F', 'M', np.nan, 'M']}
df = pd.DataFrame(data)
df
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
2 | Pedro | NaN | M |
3 | Ana | 25.0 | NaN |
4 | Luis | 27.0 | M |
# Verificar qué valores son nulos
print(df.isnull())
Nombre Edad Género 0 False False False 1 False False False 2 False True False 3 False False True 4 False False False
df[df.isnull().all(axis=1)]
Nombre | Edad | Género |
---|
# Verificar qué valores son no nulos
print(df.notnull())
Nombre Edad Género 0 True True True 1 True True True 2 True False True 3 True True False 4 True True True
df[df.notnull().all(axis=1)]
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
4 | Luis | 27.0 | M |
# Eliminar las filas que contienen valores nulos
df.dropna()
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
4 | Luis | 27.0 | M |
# Rellenar los valores nulos con un valor específico, por ejemplo cero
df.fillna(0)
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
2 | Pedro | 0.0 | M |
3 | Ana | 25.0 | 0 |
4 | Luis | 27.0 | M |
# Rellenar los valores nulos mediante interpolación
df.interpolate()
C:\Users\franc\AppData\Local\Temp\ipykernel_17964\2758315979.py:2: FutureWarning: DataFrame.interpolate with object dtype is deprecated and will raise in a future version. Call obj.infer_objects(copy=False) before interpolating instead. df.interpolate()
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
2 | Pedro | 27.5 | M |
3 | Ana | 25.0 | NaN |
4 | Luis | 27.0 | M |
# Reemplazar un valor específico (incluyendo valores nulos) con otro valor
df.replace({"Género": {np.nan: "Otro"}})
Nombre | Edad | Género | |
---|---|---|---|
0 | Juan | 20.0 | M |
1 | María | 30.0 | F |
2 | Pedro | NaN | M |
3 | Ana | 25.0 | Otro |
4 | Luis | 27.0 | M |
Observación
En Pandas, la función .all()
se utiliza para verificar si todos los valores en un eje determinado (filas o columnas) de un DataFrame son True
.
Cuando se aplica .all()
a un DataFrame, se evalúa cada valor del eje especificado (0 para filas y 1 para columnas) y devuelve True si todos los valores son True
, y False
en caso contrario. Si el DataFrame contiene valores nulos (NaN
), se consideran como False para la evaluación.
Por ejemplo, supongamos que tenemos el siguiente DataFrame:
df = pd.DataFrame({
'A': [True, False, True],
'B': [True, True, True],
'C': [False, True, True]
})
Si queremos verificar si todos los valores de cada columna son True
, podemos usar la función .all()
de la siguiente manera:
# Verificar si todos los valores de cada columna son True
columnas_con_todos_true = df.all()
print(columnas_con_todos_true)
A False B True C False dtype: bool
Si queremos verificar si todos los valores de cada fila son True
, podemos usar la función .all(axis=1)
de la siguiente manera:
# Verificar si todos los valores de cada fila son True
filas_con_todos_true = df.all(axis=1)
print(filas_con_todos_true)
0 False 1 False 2 True dtype: bool
Estos son solo algunos ejemplos de cómo puedes trabajar con fechas y horas en Pandas utilizando las clases Timestamp
, DatetimeIndex
y Period
. Pandas también proporciona muchas más funciones útiles para trabajar con datos de tiempo de manera eficiente.
Datos Duplicados¶
En Pandas, se pueden manejar los datos duplicados utilizando el método duplicated()
y drop_duplicates()
.
- El método
duplicated()
devuelve un booleano que indica si una fila es duplicada o no, es decir, si existe otra fila con los mismos valores. - El método
drop_duplicates()
elimina las filas duplicadas de un DataFrame.
Veamos un ejemplo:
# Crear un DataFrame de ejemplo con datos duplicados
data = {
'id': [1, 2, 3, 3, 4, 5, 5],
'name': ['John', 'Mary', 'Peter', 'Peter', 'Anna', 'George', 'George'],
'age': [25, 25, 35, 35, 40, 45, 45]
}
df = pd.DataFrame(data)
df
id | name | age | |
---|---|---|---|
0 | 1 | John | 25 |
1 | 2 | Mary | 25 |
2 | 3 | Peter | 35 |
3 | 3 | Peter | 35 |
4 | 4 | Anna | 40 |
5 | 5 | George | 45 |
6 | 5 | George | 45 |
# Comprobar filas duplicadas
duplicates = df.duplicated()
duplicates
0 False 1 False 2 False 3 True 4 False 5 False 6 True dtype: bool
# Eliminar filas duplicadas
df = df.drop_duplicates()
df
id | name | age | |
---|---|---|---|
0 | 1 | John | 25 |
1 | 2 | Mary | 25 |
2 | 3 | Peter | 35 |
4 | 4 | Anna | 40 |
5 | 5 | George | 45 |
También podemos eliminar duplicados por una o varías columnas utilizando el comando subset
:
# Eliminar duplicados por columna 'name'
df_sin_duplicados = df.drop_duplicates(subset=['name'])
df_sin_duplicados
id | name | age | |
---|---|---|---|
0 | 1 | John | 25 |
1 | 2 | Mary | 25 |
2 | 3 | Peter | 35 |
4 | 4 | Anna | 40 |
5 | 5 | George | 45 |