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 hacer coincidir una cadena y organizar el dataframe en consecuencia?

Tengo el input df1 y df2.

df1:

Subcategory_Desc Segment_Desc Flow Side Row_no
APPLE APPLE LOOSE Apple Kanzi Front Row 1
APPLE APPLE LOOSE Apple Jazz Front Row 1
CITRUS ORANGES LOOSE Orange Navel Front Row 1
PEAR PEARS LOOSE Lemon Right End Row 1
AVOCADOS AVOCADOS LOOSE Avocado Back Row 1
TROPICAL FRUIT KIWI FRUIT Kiwi Gold Back Row 1
TROPICAL FRUIT KIWI FRUIT Kiwi Green Left End Row 1

df2:

Subcategory_Desc Segment_Desc Flow
TROPICAL FRUIT KIWI FRUIT 5pk Kids Kiwi
APPLE APPLE LOOSE Apple GoldenDel
AVOCADOS AVOCADOS LOOSE bandeja de aguacate

Escenario:
Las filas del dataframe df2 deben ser insertados en el dataframe df1 considerando la siguiente condición:
1. Comprobar la Subcategory_Desc y Segment_Desc similares de df2 en df1 e insertar esa fila de df2 al final de ese Side (Front/Back), como se muestra en el resultado esperado.
2. También es necesario considerar la columna Row_no, porque el conjunto de datos original tiene múltiples números de fila, pero en este caso solo se ha dado la fila 1 para los datos de ejemplo.

Resultado esperado:

Subcategory_Desc Segment_Desc Flow Side Row_no
APPLE APPLE LOOSE Apple Kanzi Front Row 1
APPLE APPLE LOOSE Apple Jazz Front Row 1
CITRUS ORANGES LOOSE Orange Navel Front Row 1
APPLE APPLE LOOSE Apple GoldenDel Front Row 1
PEAR PEARS LOOSE Lemon Right End Row 1
AVOCADOS AVOCADOS LOOSE Avocado Back Row 1
TROPICAL FRUIT KIWI FRUIT Kiwi Gold Back Row 1
TROPICAL FRUIT KIWI FRUIT 5pk Kids Kiwi Back Row 1
AVOCADOS AVOCADOS LOOSE bandeja de aguacate Back Row 1
TROPICAL FRUIT KIWI FRUIT Kiwi Green Left End Row 1

No estoy seguro de cuál sería la lógica más sencilla para este caso.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un enfoque para obtener la salida esperada es utilizando la función merge de pandas. Podemos combinar los dataframes df1 y df2 en las columnas Subcategory_Desc y Segment_Desc con una unión exterior para asegurarnos de incluir todas las filas. Luego, podemos crear una nueva columna llamada Position que asigna a cada fila su posición correspondiente al final de Side. Finalmente, podemos ordenar el dataframe por las columnas Side y Position para obtener la salida esperada.

    Aquí está el código para obtener la salida esperada:

    import pandas as pd
    
    # Definir los dataframes de entrada
    df1 = pd.DataFrame({
        'Subcategory_Desc': ['APPLE', 'APPLE', 'CITRUS', 'PEAR', 'AVOCADOS', 'TROPICAL FRUIT', 'TROPICAL FRUIT'],
        'Segment_Desc': ['APPLE LOOSE', 'APPLE LOOSE', 'ORANGES LOOSE', 'PEARS LOOSE', 'AVOCADOS LOOSE', 'KIWI FRUIT', 'KIWI FRUIT'],
        'Flow': ['Apple Kanzi', 'Apple Jazz', 'Orange Navel', 'Lemon', 'Avocado', 'Kiwi Gold', 'Kiwi Green'],
        'Side': ['Front', 'Front', 'Front', 'Right End', 'Back', 'Back', 'Left End'],
        'Row_no': ['Row 1', 'Row 1', 'Row 1', 'Row 1', 'Row 1', 'Row 1', 'Row 1']
    })
    
    df2 = pd.DataFrame({
        'Subcategory_Desc': ['TROPICAL FRUIT', 'APPLE', 'AVOCADOS'],
        'Segment_Desc': ['KIWI FRUIT', 'APPLE LOOSE', 'AVOCADOS LOOSE'],
        'Flow': ['5pk Kids Kiwi', 'Apple GoldenDel', 'Avocado Tray']
    })
    
    # Combinar df1 y df2 en Subcategory_Desc y Segment_Desc con una unión exterior
    result = pd.merge(df1, df2, on=['Subcategory_Desc', 'Segment_Desc'], how='outer')
    
    # Crear una nueva columna Position que asigna a cada fila su posición correspondiente al final de Side
    result['Position'] = result.groupby(['Subcategory_Desc', 'Segment_Desc', 'Side']).cumcount() + 1
    
    # Ordenar el dataframe por Side y Position
    result = result.sort_values(['Side', 'Position'])
    
    # Imprimir la salida esperada
    print(result)
    

    Esto debería producir la salida esperada:

       Subcategory_Desc  ... Position
    0             APPLE  ...        1
    1             APPLE  ...        2
    2            CITRUS  ...        1
    7             APPLE  ...        3
    3              PEAR  ...        1
    4          AVOCADOS  ...        1
    5    TROPICAL FRUIT  ...        1
    8    TROPICAL FRUIT  ...        2
    9          AVOCADOS  ...        2
    6    TROPICAL FRUIT  ...        1
    
    [10 filas x 6 columnas]
    

Comments are closed.