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.

¿Cómo combinar un dataframe con cada grupo creado por groupby?

Dado df1 y df2:

df1:

id item sub_item
1 52 AAA
2 52 AAA
3 55 BAA
4 77 CAA
5 77 CAA
6 77 CAA
7 77 CAB
8 77 CAC

df2:

id color
1 #11
2 #12
3 #13
4 #14
5 #17
6 #18
7 #19
8 #20
9 #21
10 #25

producir df_resultado:

id item sub_item color
1 52 AAA #11
2 52 AAA #11
3 55 BAA #11
4 77 CAA #11
5 77 CAA #11
6 77 CAA #11
7 77 CAB #12
8 77 CAC #13

El campo “id” no es importante. Cada nuevo subítem, dentro de un grupo de items, recibe un nuevo número de color de serie. Los colores vuelven a asignarse desde #11 para cada nuevo item. df2 siempre será lo suficientemente largo para cubrir los subítems únicos dentro de un grupo de items.

Mi intuición dice que debemos usar “groupby” en df1, luego combinar cada grupo con df2, pero necesito ayuda con el código para lograr esto.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Primero, necesitamos crear una nueva columna en df1 que represente la combinación única de item-sub_item para cada fila.

    df1['item_sub_item'] = df1['item'].astype(str) + '-' + df1['sub_item']
    

    Luego, podemos ordenar df1 por item y sub_item.

    df1 = df1.sort_values(['item', 'sub_item'])
    

    A continuación, necesitamos crear una nueva columna en df1 que represente el número de color serial para cada combinación de item-sub_item. Utilizaremos groupby y cumcount para lograr esto.

    df1['color_num'] = df1.groupby('item_sub_item').cumcount() + 1
    

    Ahora, podemos fusionar df1 y df2 en color_num. Solo mantendremos las columnas id y color de df2.

    df_result = pd.merge(df1, df2[['id', 'color']], left_on='color_num', right_index=True)
    

    Finalmente, podemos eliminar las columnas innecesarias de df1 y df_result.

    df_result = df_result.drop(['item_sub_item', 'color_num'], axis=1)
    df1 = df1.drop(['item_sub_item', 'color_num'], axis=1)
    

    El resultado obtenido en df_result debería coincidir con la salida deseada.

Comments are closed.