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 crear un dataframe modificado basado en los valores de una lista?

Considere un dataframe df con la siguiente estructura: –

Name    Slide          Height      Weight       Status       General
A           X             3            0.1             0.5       0.2
B           Y            10            0.2             0.7       0.8
    ...

Me gustaría crear duplicados para cada fila en este dataframe (específicamente para Name y Slide) para las siguientes combinaciones de Height y Weight mostradas en esta lista: –

list_combinations = [[3,0.1],[10,0.2],[5,1.3]]

La salida deseada: –

Name    Slide          Height      Weight       Status       General
A           X             3            0.1             0.5       0.2 #original 
A           X             10           0.2             0.5       0.2 # duplicado modificado
A           X             5            1.3             0.5       0.2 # duplicado modificado
B           Y            10            0.2             0.7       0.8 #original
B           Y             3            0.1             0.7       0.8 # duplicado modificado
B           Y             5            1.3             0.7       0.8 # duplicado modificado
etc. ...

Cualquier sugerencia y ayuda sería muy apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes usar la función merge de pandas en combinación con los métodos explode e isin. Aquí está cómo puedes hacerlo:

    import pandas as pd
    
    # crear el dataframe de entrada
    df = pd.DataFrame({'Name': ['A', 'B'], 'Slide': ['X', 'Y'], 'Height': [3, 10], 'Weight': [0.1, 0.2], 'Status': [0.5, 0.7], 'General': [0.2, 0.8]})
    
    # crear la lista de combinaciones
    list_combinations = [[3,0.1],[10,0.2],[5,1.3]]
    
    # convertir la lista en un dataframe y agregar las columnas de Name y Slide
    df_combinations = pd.DataFrame(list_combinations, columns=['Height', 'Weight'])
    df_combinations['Name'] = 'temp'
    df_combinations['Slide'] = 'temp'
    
    # fusionar los dos dataframes basado en Name y Slide
    df_merged = pd.merge(df, df_combinations, on=['Name', 'Slide'], how='outer')
    
    # filtrar las filas que pertenecen al dataframe original
    df_original = df_merged[df_merged[['Name', 'Slide', 'Height', 'Weight']].isin(df[['Name', 'Slide', 'Height', 'Weight']]).all(1)]
    
    # filtrar las filas que pertenecen a los duplicados
    df_duplicates = df_merged[df_merged[['Name', 'Slide', 'Height', 'Weight']].isin(list_combinations).all(1)]
    
    # eliminar las columnas temporales y concatenar los dos dataframes
    df_result = pd.concat([df_original.drop(['Height', 'Weight'], axis=1), df_duplicates], sort=False)
    
    # ordenar el dataframe por Name y Slide
    df_result = df_result.sort_values(['Name', 'Slide', 'Height', 'Weight'])
    
    print(df_result)
    

    Esto debería producir el dataframe de salida deseado. El código funciona de la siguiente manera:

    1. Se crea el dataframe de entrada df y la lista de combinaciones list_combinations.
    2. La lista se convierte en un dataframe llamado df_combinations, que contiene las columnas de Name y Slide.
    3. Los dos dataframes se fusionan en las columnas de Name y Slide utilizando una unión externa. Esto crea un dataframe que contiene todas las posibles combinaciones de Name, Slide, Height y Weight.
    4. Se filtran las filas que pertenecen al dataframe original revisando si el Name, Slide, Height y Weight de cada fila están presentes en df.
    5. Se filtran las filas que pertenecen a los duplicados revisando si el Height y Weight de cada fila están presentes en list_combinations.
    6. Se eliminan las columnas temporales del dataframe df_original y se concatenan los dos dataframes.
    7. El dataframe resultante se ordena por Name, Slide, Height y Weight.

Comments are closed.