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.
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