Función df.fillna() de Pandas
df.fillna()Es una función de Pandas que se utiliza para rellenar valores faltantes.
ydropna()A diferencia de eliminar los valores faltantes,fillna()nos permite rellenar los datos faltantes con valores especificados, la media, la mediana, el relleno hacia adelante o el relleno hacia atrás, entre otros. Esto es muy útil para mantener la integridad de los datos y la precisión del análisis.
Sintaxis básica y parámetros
fillna()Es una función miembro de DataFrame, que se invoca mediante el operador punto.para llamarla.
Formato de sintaxis
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
Descripción de parámetros
| Parámetro | Tipo | Obligatorio | Descripción | Valor por defecto |
|---|---|---|---|---|
| value | scalar, dict, Series, DataFrame | Opcional | Valor utilizado para rellenar los valores faltantes. Puede ser una constante, un diccionario (que especifica diferentes valores para diferentes columnas), una Serie o un DataFrame. | None |
| method | str | Opcional | Método de relleno.'ffill'o'pad'`'ffill'` indica rellenar con el valor anterior (relleno hacia adelante);'bfill'o'backfill'`'bfill'` indica rellenar con el valor siguiente (relleno hacia atrás). |
None |
| axis | int o str | Opcional | Especifica la dirección del relleno.0o'index'`0` indica el relleno por filas;1o'columns'`1` indica el relleno por columnas. Solo es válido cuandomethod`method` no esNone`None`. |
0 |
| inplace | bool | Opcional | Si es `True`True, modifica directamente el DataFrame original y no devuelve un objeto nuevo; si es `False`False, devuelve un nuevo DataFrame y los datos originales no cambian. |
False |
| limit | int | Opcional | Especifica el número máximo de rellenos consecutivos. Por ejemplo, si se establecelimit=1significa que solo se rellena 1 valor faltante a la vez. |
None |
| downcast | dict o str | Opcional | Especifica las reglas de conversión descendente de tipos de datos, como convertir float64 a int64. | None |
Descripción del valor de retorno
- Devuelve un nuevo DataFrame (si `inplace=False`
inplace=False), o `None` (siNone`inplace=True`).inplace=True)。 - En el DataFrame devuelto, los valores faltantes han sido rellenados.
Ejemplos
Vamos a dominar completamente, mediante una serie de ejemplos,fillna()su uso.
Ejemplo 1: Rellenar todos los valores faltantes con una constante
El uso más simple es rellenar todos los valores faltantes con una constante.
Ejemplo
import numpy as np
# Crear un DataFrame con valores faltantes
data = {
'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
'Edad': [25, np.nan, 35, np.nan], # valor faltante
'Salario': [5000, 6000, np.nan, 8000], # valor faltante
'Departamento': ['Tecnología', 'Marketing', 'Tecnología', np.nan] # valor faltante
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Rellenar todos los valores faltantes con la constante 0
df_filled = df.fillna(0)
print("Datos después de rellenar con 0:")
print(df_filled)
Resultado esperado:
原始数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 NaN 6000.0 市场
2 王五 35.0 NaN 技术
3 赵六 NaN 8000.0 NaN
==================================================
用0填充后的数据:
名称 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 0.0 6000.0 市场
2 王五 35.0 0.0 技术
3 赵六 0.0 8000.0 0
Análisis del código:
- Creamos un DataFrame con múltiples valores faltantes.
- Usamos
df.fillna(0)para reemplazar todos los valores faltantes por 0. - Este método es simple y directo, pero puede no ser adecuado para todos los escenarios; por ejemplo, rellenar la edad y el salario con 0 puede no ser muy razonable.
Ejemplo 2: Especificar diferentes valores de relleno para diferentes columnas con un diccionario
Se pueden especificar diferentes valores de relleno para diferentes columnas, haciendo que los datos sean más razonables.
Ejemplo
import numpy as np
# Crear un DataFrame con valores faltantes
data = {
'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu'],
'Edad': [25, np.nan, 35, np.nan],
'Salario': [5000, 6000, np.nan, 8000],
'Departamento': ['Tecnología', 'Marketing', 'Tecnología', np.nan],
'Rendimiento': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Usar un diccionario para especificar diferentes valores de relleno para diferentes columnas
fill_values = {
'Edad': 30, # Si falta la edad, rellenar con 30
'Salario': 6500, # Si falta el salario, rellenar con 6500
'Departamento': 'No asignado', # Si falta el departamento, rellenar con "No asignado"
'Rendimiento': 80 # Si falta el rendimiento, rellenar con 80
}
df_filled = df.fillna(fill_values)
print("Datos después de rellenar diferentes columnas con diferentes valores:")
print(df_filled)
Resultado esperado:
原始数据:
姓名 年龄 薪资 部门 绩效
0 张三 25.0 5000.0 技术 85
1 李四 NaN 6000.0 市场 90
2 王五 35.0 NaN 技术 NaN
3 赵六 NaN 8000.0 NaN 95
==================================================
不同列用不同值填充后的数据:
姓名 年龄 薪资 部门 绩效
0 张三 25.0 5000.0 技术 85
1 李四 30.0 6000.0 市场 90
2 王五 35.0 6500.0 技术 80
3 赵六 30.0 8000.0 未分配 95
Análisis del código:
- Mediante el diccionario
fill_values, especificamos valores de relleno razonables para cada columna. - Este método es más flexible, ya que permite establecer valores predeterminados adecuados para diferentes campos según la lógica de negocio.
Ejemplo 3: Rellenar columnas numéricas con la media o la mediana
Para datos numéricos, rellenar con la media o la mediana es un método común y razonable.
Ejemplo
import numpy as np
# Crear un DataFrame con valores faltantes
data = {
'Nombre': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', 'Qian Qi'],
'Matemáticas': [85, 90, np.nan, 78, 92],
'Inglés': [88, np.nan, 82, 85, 90],
'Física': [np.nan, 85, 90, 88, 95]
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Calcular la media de cada columna
math_mean = df['Matemáticas'].mean()
english_mean = df['Inglés'].mean()
physics_mean = df['Física'].mean()
print(f"Media de matemáticas: {math_mean:.2f}")
print(f"Media de inglés: {english_mean:.2f}")
print(f"Media de física: {physics_mean:.2f}")
print("=" * 50)
# Rellenar con la media
df_filled = df.fillna({
'Matemáticas': math_mean,
'Inglés': english_mean,
'Física': physics_mean
})
print("Datos después de rellenar con la media:")
print(df_filled)
Resultado esperado:
原始数据:
姓名 数学 英语 物理
0 张三 85.0 88.0 NaN
1 李四 90.0 NaN 85.0
2 王五 NaN 82.0 90.0
3 赵六 78.0 85.0 88.0
4 钱七 92.0 90.0 95.0
==================================================
数学均值: 86.25
英语均值: 86.25
物理均值: 89.50
==================================================
用均值填充后的数据:
姓名 数学 英语 物理
0 张三 85.0 88.0 89.5
1 李四 90.0 86.25 85.0
2 王五 86.25 82.0 90.0
3 赵六 78.0 85.0 88.0
4 钱七 92.0 90.0 95.0
Análisis del código:
- Usamos
df['列名'].mean()para calcular la media de cada columna. - Usar las medias calculadas como valores de relleno mantiene las características generales de distribución de los datos y, a la vez, resuelve el problema de los valores faltantes.
Ejemplo 4: Usar el relleno hacia adelante (ffill) y el relleno hacia atrás (bfill)
El relleno hacia adelante rellena los valores faltantes con el valor válido anterior; el relleno hacia atrás rellena los valores faltantes con el valor válido siguiente.
Ejemplo
import numpy as np
# Crear un DataFrame con valores faltantes
data = {
'Fecha': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
'Temperatura': [20, np.nan, 22, np.nan, 25],
'Humedad': [60, 65, np.nan, 70, 75]
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Relleno hacia adelante: rellenar los valores faltantes con el valor anterior
df_ffill = df.fillna(method='ffill')
print("Datos después del relleno hacia adelante (ffill):")
print(df_ffill)
print("=" * 50)
# Relleno hacia atrás: rellenar los valores faltantes con el valor siguiente
df_bfill = df.fillna(method='bfill')
print("Datos después del relleno hacia atrás (bfill):")
print(df_bfill)
Resultado esperado:
原始数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 NaN 65.0
2 2024-01-03 22.0 NaN
3 2024-01-04 NaN 70.0
4 2024-01-05 25.0 75.0
==================================================
向前填充(ffill)后的数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 20.0 65.0 # 用前一个值20填充
2 2024-01-03 22.0 65.0 # 用前一个值65填充
3 2024-01-04 22.0 70.0 # 用前一个值22填充
4 2024-01-05 25.0 75.0
==================================================
向后填充(bfill)后的数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 22.0 65.0 # 用后一个值22填充
2 2024-01-03 22.0 70.0 # 用后一个值70填充
填充
3 2024-01-04 25.0 70.0 # 用后一个值25填充
4 2024-01-05 25.0 75.0
Análisis del código:
- Relleno hacia adelante (
ffill`ffill`): la temperatura de la fila 1 falta y se rellena con el 20 de la fila 0; la temperatura de la fila 3 falta y se rellena con el 22 de la fila 2. - Relleno hacia atrás (
bfill`bfill`): la temperatura de la fila 1 falta y se rellena con el 22 de la fila 2; la temperatura de la fila 3 falta y se rellena con el 25 de la fila 4. - Este método es adecuado para datos de series temporales, como precios de acciones, registros de temperatura, etc.
Ejemplo 5: Usar el parámetro limit para limitar la cantidad de relleno
limitEl parámetro `limit` puede limitar el número máximo de rellenos consecutivos.
Ejemplo
import numpy as np
# Crear un DataFrame con múltiples valores faltantes consecutivos
data = {
'A': [1, np.nan, np.nan, np.nan, 5],
'B': [1, 2, np.nan, np.nan, 5]
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Rellenar hacia adelante, pero limitando a llenar solo 1 valor faltante consecutivo cada vez
df_filled = df.fillna(method='ffill', limit=1)
print("Datos después de limitar el relleno consecutivo a 1:")
print(df_filled)
Resultado esperado:
原始数据:
A B
0 1.0 1.0
1 NaN 2.0
2 NaN NaN
3 NaN NaN
4 5.0 5.0
==================================================
限制连续填充数量为1后的数据:
A B
0 1.0 1.0
1 1.0 2.0 # 填充1个
2 NaN 2.0 # 达到limit,不再填充
3 NaN NaN # 继续不填充
4 5.0 5.0
Análisis del código:
- Para la columna A, el valor faltante de la fila 1 se rellena con 1, pero las filas 2 y 3, al alcanzar limit=1, no se siguen rellenando.
- Para la columna B, el valor faltante de la fila 2 se rellena con 2, la fila 3, al alcanzar limit=1, no se sigue rellenando.
Ejemplo 6: Rellenar valores faltantes con el método de interpolación
Pandas también proporcionainterpolate()método para realizar interpolación, adecuado para datos numéricos.
Ejemplo
import numpy as np
# Crear un DataFrame con valores faltantes
data = {
'x': [1, 2, 3, 4, 5],
'y': [10, np.nan, 30, np.nan, 50]
}
df = pd.DataFrame(data)
print("Datos originales:")
print(df)
print("=" * 50)
# Usar interpolación lineal para rellenar
df_interpolated = df.copy()
df_interpolated['y'] = df_interpolated['y'].interpolate(method='linear')
print("Datos después del relleno por interpolación lineal:")
print(df_interpolated)
Resultado esperado:
原始数据: x y 0 1 10.0 1 2 NaN 2 3 30.0 3 4 NaN 4 5 50.0 ================================================== 线性插值填充后的数据: x y 0 1 10.0 1 2 20.0 # 插值:10 + (30-10)/(3-1)*(2-1) = 20 2 3 30.0 3 4 40.0 # 插值:30 + (50-30)/(5-3)*(4-3) = 40 4 5 50.0
Análisis del código:
- La interpolación lineal calcula los valores faltantes según los valores conocidos anteriores y posteriores.
- Fila 1: 10 + (30-10)/(3-1)*(2-1) = 20.
- Fila 3: 30 + (50-30)/(5-3)*(4-3) = 40.
- El método de interpolación es adecuado para datos cuyos valores cambian linealmente.
Notas
fillna()Por defecto no modifica el DataFrame original; si se quiere modificar en el lugar, useinplace=Trueparámetro.- Nota
methodEl parámetro puede quedar obsoleto en versiones futuras de Pandas; se recomienda usarffill()ybfill()el método en su lugar. - Al usar el relleno con la media, si hay valores extremos (outliers) en los datos, se puede considerar usar la mediana para rellenar, ya que es más robusto.
- Para datos categóricos (como departamento, puesto), se recomienda usar el valor más frecuente (moda) o una categoría explícita (como "desconocido") para rellenar.
- Antes de rellenar los valores faltantes, se recomienda analizar primero las causas y patrones de las ausencias, y elegir el método de relleno más adecuado.
Otras extensiones
Funciones comunes de Pandas