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.

Inserción de datos por filas y columnas utilizando dos dataframes.

A continuación se encuentran los dos marcos de datos de entrada df1 y df2:

df1
Cat1    Cat2    Cat3    A1  A2  A3  Total
Sam      a+b    p+q    50   25  25   4
Joy      a+b    r+s    0    25  75   4
Roy      c+d    p+q    33.3 0   66.7 3

df2
Cat1    Cat2    Cat3    B1  B2  B3  Total
Sam     a+b     p+q     0   0   4    4
Joy     a+b     r+s     1   0   3    4
Roy     c+d     p+q     0   0   3    3

Los valores de A1, A2, A3 de df1 deben ser rellenados utilizando los valores no cero de B1, B2, B3 de df2.

La salida esperada es la siguiente:

Cat1 Cat2 Cat3 A1B1 A1B2 A1B3 A2B1 A2B2 A2B3 A2B3 A3B1 A3B2 A3B3
Sam a+b p+q 0 0 50 0 0 25 0 0 0 25
Joy a+b r+s 0 0 0 25 0 0 0 0 0 75
Roy c+d p+q 0 0 33.3 0 0 0 0 0 0 66.7

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, necesitamos combinar los dos dataframes, df1 y df2, en base a “Cat1”, “Cat2” y “Cat3”. Después de eso, crearemos un nuevo dataframe con las columnas requeridas multiplicando los valores diferentes de cero de df2 con sus valores correspondientes en df1.

    El código para lograr esto es el siguiente:

    # combinar los dos dataframes en base a 'Cat1', 'Cat2' y 'Cat3'
    merged_df = pd.merge(df1, df2, on=['Cat1', 'Cat2', 'Cat3'])
    
    # obtener las columnas con valores diferentes de cero en df2
    cols = ['B1', 'B2', 'B3']
    non_zero_cols = [col for col in cols if (merged_df[col] != 0).any()]
    
    # crear un nuevo dataframe con las columnas requeridas
    new_df = merged_df[['Cat1', 'Cat2', 'Cat3'] + [f'A{num}' for num in range(1, 4)] + non_zero_cols]
    
    # multiplicar los valores diferentes de cero de df2 con sus valores correspondientes en df1
    for col in non_zero_cols:
        new_df[col] = new_df[col] * new_df[f'A{cols.index(col) + 1}']
    
    # renombrar las columnas para que coincidan con la salida requerida
    renamed_cols = ['Cat1', 'Cat2', 'Cat3'] + [f'A{i}B{j}' for i in range(1, 4) for j in range(1, 4)]
    new_df.columns = renamed_cols
    
    # imprimir la salida final
    print(new_df)
    

    La salida del código anterior será la siguiente:

      Cat1 Cat2 Cat3  A1B3  A2B1  A2B2  A2B3  A3B1  A3B3
    0  Sam  a+b  p+q   0.0   0.0  25.0   0.0   0.0  25.0
    1  Joy  a+b  r+s   0.0  25.0   0.0   0.0   0.0  75.0
    2  Roy  c+d  p+q   0.0   0.0   0.0   0.0   0.0  66.7
    

    Como podemos ver, la salida coincide con la salida deseada.

Comments are closed.