Pandas Fillna Múltiples Columnas

Salman Mehmood 21 junio 2023
Pandas Fillna Múltiples Columnas

Este artículo explica cómo usar la función fillna() para reemplazar los valores NaN por valores numéricos. También aprenderemos cómo reemplazar los valores NaN del marco de datos de Pandas con cadenas.

Reemplace múltiples columnas de valores NaN con cualquier tipo de datos usando fillna() en Pandas

La función fillna() de Pandas puede reemplazar los valores NaN con un valor específico. La función puede propagar este valor dentro de una columna o fila o reemplazar los valores NaN con diferentes valores según la columna.

Haremos un nuevo script con la biblioteca Pandas importada como pd seguida de la biblioteca NumPy importada como np. A continuación, crearemos un nuevo marco de datos llamado City_Temp y lo estableceremos igual al marco de datos de Pandas.

Digamos que estamos rastreando las temperaturas de 2 ciudades, Tulsa y Dallas, durante una semana, pero los datos están incompletos. Crearemos dos filas de datos que contengan valores de temperatura para cada ciudad durante 5 días.

La primera fila contendrá la clave de Tulsa con algunos valores numéricos y np.nan dentro de una lista, y la segunda fila con la clave de Dallas también contiene algunos valores numéricos y np.nan. El valor np.nan crea un valor nulo en el marco de datos.

A continuación, agregaremos el argumento índice con una lista que contiene los nombres abreviados de lunes a viernes. Cuando el resultado se imprima en la consola, veríamos un marco de datos con valores de temperatura para dos ciudades durante 5 días separados.

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

Para llenar los valores vacíos dentro del marco de datos City_Temp, podemos usar la función fillna() de Pandas dentro de una declaración print. En la función fillna(), agregaremos un solo valor de 80.0, y cuando el resultado se imprima en la consola, veremos que todos los valores NaN del marco de datos han sido reemplazados por el número 80.0.

print(City_Temp.fillna(80.0))

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    80.0
Thu   80.0    80.0
Fri   80.0    92.1

Como alternativa a proporcionar un valor específico, podemos usar el argumento método con el valor rellenar para indicarle a la función que rellene los valores NaN con el valor que se encuentra encima en la misma columna. Aquí, los valores de NaN para Tulsa se reemplazan por 75,1, y los valores para Dallas se reemplazan por 93,1.

print(City_Temp.fillna(method="ffill"))

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1    93.1
Fri   75.1    92.1

De manera similar, podemos realizar un relleno cuando el valor del argumento método se establece en bfill. El resultado muestra que los valores NaN en la columna Dallas se completan con el valor 92.1, pero los valores en la columna Tulsa no se reemplazan.

Esto se debe a que no hay un valor válido debajo de la fila “Viernes” que pueda usarse para reemplazar los valores NaN.

print(City_Temp.fillna(method="bfill"))

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    92.1
Thu    NaN    92.1
Fri    NaN    92.1

Si queremos llenar la primera ocurrencia del elemento NaN en el marco de datos para cada ciudad, podemos usar el valor ffil para el tipo método y agregar el argumento límite con un valor de 1. El resultado muestra que solo la primera aparición del valor NaN se reemplaza con un relleno hacia adelante.

print(City_Temp.fillna(method="ffill", limit=1))

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1     NaN
Fri    NaN    92.1

Rellene los elementos NaN con la media

Por último, podemos especificar diferentes valores para los elementos NaN en diferentes columnas.

Digamos que queremos llenar los elementos NaN con el valor de temperatura promedio de esa ciudad. Para ello, haremos un diccionario usando llaves dentro de la función fillna().

En el diccionario, agregaremos la clave Tulsa con el valor de temperatura promedio redondeado a 2 decimales usando la función np.round() con la función np.mean() dentro de ella.

Dentro de la función mean(), añadiremos el marco de datos City_Temp como primer argumento y especificaremos la columna Tulsa entre corchetes seguida del número entero 2 para redondear el resultado a 2 decimales. Esto se repetirá para el par clave y valor Dallas.

Podemos reasignar el marco de datos para que se cambie de forma permanente.

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

Cuando se imprime el resultado en la consola, vemos que el valor promedio de Tulsa, 77,87, ha reemplazado los elementos NaN para jueves y viernes, y el valor promedio de Dallas, 89,47, ha reemplazado los elementos NaN para el miércoles. y jueves.

     Tulsa  Dallas
Mon  78.50   83.20
Tue  80.00   93.10
Wed  75.10   89.47
Thu  77.87   89.47
Fri  77.87   92.10

Reemplace los valores NaN con una cadena

En su caso, el tipo de datos podría ser cualquier cosa, pero en ese caso, también puede reemplazar el valor NaN o el valor nulo usando el siguiente código.

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

Producción :

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

Considere el siguiente código para reemplazar los valores NaN con una cadena.

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)

Producción :

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

También podemos usar el siguiente fragmento de código para reemplazar los valores NaN con una cadena, que funcionará igual que el código que mencionamos anteriormente.

print(City_Temp.fillna("."))

Producción :

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

Código completo:

# In[1]:

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

# In[2]:

print(City_Temp.fillna(80.0))

# In[3]:

print(City_Temp.fillna(method="ffill"))

# In[4]:

print(City_Temp.fillna(method="bfill"))

# In[5]:

print(City_Temp.fillna(method="ffill", limit=1))

# In[6]:

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

# ##### Replace nan with string

# In[7]:

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)
print(City_Temp)

# In[8]:

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)
# In[9]:
print(City_Temp.fillna("."))

Puede leer aquí para obtener más soluciones.

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Pandas Column