es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for 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:

    merged_df = pd.merge(df1, df2[['Nombre del activo', 'Puntuación', 'Grado']], on='Nombre del activo', how='left')
    merged_df['Puntuación'] = merged_df['Puntuación_y'].fillna(merged_df['Puntuación_x'])
    merged_df['Grado'] = merged_df['Grado_y'].fillna(merged_df['Grado_x'])
    merged_df = merged_df[['Nombre del activo', 'Puntuación', 'Grado', 'Tipo']]
    

    Esto nos dará la siguiente salida:

    Nombre del activo Puntuación Grado Tipo
    Apple 70 C fruta
    Pear 60 B fruta
    Banana 100 A fruta

    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.

Comments are closed.