Fusión de DataFrame de Pandas basada en el nombre de celda coincidente.
Tengo un dataframe DF1 que contiene:
Asset Name | Type | Score | Grade |
---|---|---|---|
Apple | fruit | nan | nan |
Pear | fruit | nan | nan |
Banana | fruit | nan | nan |
Tengo DF2 que contiene:
Asset Name | Score | Grade |
---|---|---|
Orange | 40 | C |
Banana | 100 | A |
Pear | 60 | B |
Potato | 10 | F |
Apple | 70 | E |
import pandas as pd
data1 = {'Asset Name':['Apple', 'Pear', 'Banana'], 'Type':['fruit', 'fruit', 'fruit'],'Score':['nan', 'nan','nan'], 'Grade':['nan','nan','nan']}
data2 = {'Asset Name':['Orange', 'Banana','Pear','Potato','Apple'], 'Score':[40,100,60,10,70], 'Grade':['C','A','B','F','E']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
Puedo utilizar:
combined = pd.concat([DF1, Df2]).groupby('Asset Name').first()
Esto me da lo siguiente:
Asset Name | Score | Grade | Type |
---|---|---|---|
Apple | 70 | E | fruit |
Banana | 100 | A | fruit |
Orange | 40 | C | None |
Pear | 60 | B | fruit |
Potato | 10 | F | None |
Esto no es exactamente lo que quiero. Solo quiero que se actualice la puntuación y la calificación para Apple, Pear y Banana, ya que están en DF1. Si el nombre del activo no está en DF1 y DF2, entonces la puntuación y la calificación no se deben actualizar.
Del mismo modo, si intento usar:
combined = df2.combine_first(df1)
Asset Name | Grade | Score | Type |
---|---|---|---|
Orange | C | 70 | fruit |
Banana | A | 100 | fruit |
Pear | B | 40 | fruit |
Potato | F | 10 | fruit |
Apple | E | 70 | None |
Obtengo elementos que tampoco quiero, ya que solo quiero que se actualicen los elementos de DF1.
¿Cómo puedo actualizar solo las filas en DF1 que coincidan con el ‘Asset Name’ en DF2 y agregar los datos de DF2 a esos activos en DF1?
Lo que me gustaría lograr es lo siguiente:
Asset Name | Score | Grade | Type |
---|---|---|---|
Apple | 70 | C | fruit |
Pear | 60 | B | fruit |
Banana | 100 | A | fruit |
Gracias
davy.ai
Para actualizar únicamente las filas en DF1 que coinciden con el ‘Nombre del activo’ en DF2, y agregar los datos de DF2 a esos activos en DF1, podemos utilizar la función merge() en pandas. A continuación te muestro cómo hacerlo:
Esto nos dará la siguiente salida:
Aquí, primero fusionamos los dos dataframes en la columna ‘Nombre del activo’ utilizando una unión izquierda (left join), para obtener únicamente las filas de DF1 que coinciden con la columna ‘Nombre del activo’ en DF2.
A continuación, llenamos cualquier valor faltante para ‘Puntuación’ y ‘Grado’ de DF2 utilizando la función fillna(). Primero intentamos llenar los valores de ‘Puntuación_y’ y ‘Grado_y’, que corresponden a las columnas ‘Puntuación’ y ‘Grado’ de DF2, respectivamente. Si esos valores están faltantes (es decir, NaN), utilizamos los valores correspondientes de DF1, que están en ‘Puntuación_x’ y ‘Grado_x’.
Por último, reordenamos las columnas para que coincidan con la salida deseada.