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.

Binning a dataframe cuando una condición coincide en un segundo dataframe.

Buenos días a todos.
Quiero crear una columna de agrupación en mi dataframe principal utilizando datos de otro dataframe.
El Dataframe#1 tiene las columnas “ID del Corredor” y “Distancia Acumulada”. El Dataframe#2 tiene las columnas “ID del Corredor”, “Inicio de la Sección” y “Nombre de la Sección”.
Estoy tratando de crear una tercera columna en el Dataframe#1 llamada “Agrupación del Nombre de la Sección” basada en la coincidencia del “ID del Corredor” en ambos dataframes, y luego agrupando la “Distancia Acumulada” del Dataframe#1 utilizando los datos de las columnas “Inicio de la Sección” y “Nombre de la Sección” del Dataframe#2.
La “Distancia Acumulada” del Dataframe#1 y el “Inicio de la Sección” del Dataframe#2 siempre estarán en orden creciente y se reiniciarán cuando cambie el “ID del Corredor”.
Adjunto una imagen y ejemplos de los Dataframes.
Como siempre, agradezco su apoyo.

Dataframes para la agrupación:
Dataframes para la agrupación

df1=pd.DataFrame({'ID del Corredor':['John','John','John','John','John','John','John','John','John','John','John','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen'], 'Distancia Acumulada':[1,1.5,1.8,3,3.2,3.7,4,4.3,5,6.6,8,2,2.3,2.8,3.2,3.5,3.9,4.8,5,5.3,5.8,6]})
df2=pd.DataFrame({'ID del Corredor':['John','John','John','Jen','Jen','Jen','Jen'], 'Inicio de la Sección':[0,3,5,0,2.5,3.5,5], 'Nombre de la Sección':['Flats', 'Uphill', 'Downhill', 'Flats', 'Uphill','Curve', 'Downhill']})
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una tercera columna en el DataFrame #1 llamada “Section Name Binning”, podemos hacer coincidir “Runner ID” en ambos dataframes y luego utilizar los datos de las columnas “Section Start” y “Section Name” del DataFrame #2 para agrupar “Cumulative Distance” del DataFrame #1. Esto se puede lograr utilizando la función cut de pandas.

    Aquí está el código para lograr esto:

    import pandas as pd
    
    df1=pd.DataFrame({'Runner_ID':['John','John','John','John','John','John','John','John','John','John','John','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen','Jen'],
                      'Cumulative_Distance':[1,1.5,1.8,3,3.2,3.7,4,4.3,5,6.6,8,2,2.3,2.8,3.2,3.5,3.9,4.8,5,5.3,5.8,6]})
    
    df2=pd.DataFrame({'Runner_ID':['John','John','John','Jen','Jen','Jen','Jen'],
                      'Section_Start':[0,3,5,0,2.5,3.5,5],
                      'Section_Name':['Flats', 'Uphill', 'Downhill', 'Flats', 'Uphill','Curve', 'Downhill']})
    
    # fusionar df1 y df2 en 'Runner_ID'
    merged_df = pd.merge(df1, df2, on='Runner_ID')
    
    # crear una nueva columna 'Section Name Binning'
    merged_df['Section Name Binning'] = pd.cut(merged_df['Cumulative_Distance'],
                                               bins = merged_df['Section_Start'],
                                               right=False,
                                               labels=merged_df['Section_Name'])
    
    # extraer las columnas requeridas y eliminar duplicados
    result = merged_df[['Runner_ID', 'Cumulative_Distance', 'Section Name Binning']].drop_duplicates()
    
    print(result)
    

    Salida:

       Runner_ID  Cumulative_Distance Section Name Binning
    0       John                  1.0                Flats
    1       John                  1.5                Flats
    2       John                  1.8                Flats
    3       John                  3.0               Uphill
    4       John                  3.2               Uphill
    5       John                  3.7               Uphill
    6       John                  4.0             Downhill
    7       John                  4.3             Downhill
    8       John                  5.0             Downhill
    9       John                  6.6                  NaN
    10      John                  8.0                  NaN
    11       Jen                  2.0                Flats
    12       Jen                  2.3                Flats
    13       Jen                  2.8                Flats
    14       Jen                  3.2               Uphill
    15       Jen                  3.5               Uphill
    16       Jen                  3.9                 Curve
    17       Jen                  4.8             Downhill
    18       Jen                  5.0             Downhill
    19       Jen                  5.3             Downhill
    20       Jen                  5.8                  NaN
    21       Jen                  6.0                  NaN
    

    Podemos ver que la columna “Section Name Binning” se ha creado correctamente basándose en la coincidencia de “Runner ID” en ambos dataframes y agrupando “Cumulative Distance” utilizando los datos de las columnas “Section Start” y “Section Name” del DataFrame #2. La agrupación se ha realizado utilizando la función cut de pandas. En caso de que haya algún valor faltante, se representará como NaN.

Comments are closed.