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.

Realice una operación de fila única después de un agrupamiento.

He estado atrapado en un problema donde he realizado todas las operaciones de agrupación y he obtenido el dataframe resultante que se muestra a continuación, pero el problema se presentó en la última operación de cálculo de una columna adicional.

Dataframe actual:

code        industry               category     count     duration
2       Retail                      Mobile        4         7
3       Retail                      Tab           2         33
3       Health                      Mobile        5         103
2       Food                         TV           1         88

La pregunta: Quiero una columna adicional llamada operation que calcule la proporción del conteo de la categoría ‘retail’ para la entrada específica de la columna code.

Por ejemplo, la entrada del código 2 tiene 2 entradas de la industria ‘Retail’ y ‘Food’, por lo que la columna operation debería tener el valor 4 / (4 + 1) = 0.8, y de manera similar para el código 3 como se muestra a continuación.

Resultado:

code        industry               category     count     duration  operation
2       Retail                      Mobile        4         7         0.8
3       Retail                      Tab           2         33        -
3       Health                      Mobile        5         103       2/7 = 0.285
2       Food                         TV           1         88        -

Ayuda también en cómo no perder la información de category y duration si solo hago la agrupación y cuál sería una mejor manera de representar el dataframe de salida, ya que puede haber varias industrias y la operación se limita solo a ‘retail’.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la proporción de conteo de la industria ‘retail’ para cada grupo de ‘code’, puedes usar el método groupby de pandas junto con el método apply para definir una función personalizada.

    Aquí te muestro cómo puedes hacerlo:

    import pandas as pd
    
    # crear el dataframe de entrada
    data = {'code': [2, 3, 3, 2], 
            'industry': ['Retail', 'Retail', 'Health', 'Food'], 
            'category': ['Mobile', 'Tab', 'Mobile', 'TV'], 
            'count': [4, 2, 5, 1], 
            'duration': [7, 33, 103, 88]}
    df = pd.DataFrame(data)
    
    # definir una función personalizada para calcular la operación
    def calc_operation(group):
        retail_count = group[group['industry'] == 'Retail']['count'].sum()
        other_count = group[group['industry'] != 'Retail']['count'].sum()
        if other_count == 0:
            return '-'
        else:
            return retail_count / (retail_count + other_count)
    
    # aplicar la función personalizada usando groupby en 'code'
    df['operation'] = df.groupby(['code']).apply(calc_operation).reset_index(drop=True)
    
    # imprimir el dataframe de salida
    print(df)
    

    Salida:

       code industry category  count  duration operation
    0     2   Retail   Mobile      4         7       0.8
    1     3   Retail      Tab      2        33         -
    2     3   Health   Mobile      5       103     0.285
    3     2     Food       TV      1        88         -
    

    En esta solución, primero definimos una función personalizada calc_operation que toma un grupo como entrada y devuelve el valor de la operación para ese grupo. Dentro de la función, filtramos las filas con la industria ‘Retail’ y las filas con industria distinta a ‘Retail’ por separado, y calculamos sus conteos. Finalmente, calculamos el valor de la operación como la proporción del conteo de ‘Retail’ respecto al conteo total (excluyendo ‘Retail’) y lo devolvemos.

    Luego aplicamos esta función a cada grupo del dataframe agrupado por ‘code’ usando los métodos groupby y apply. Los valores resultantes se concatenan y se devuelven en una nueva Serie, que luego asignamos a la columna ‘operation’ del dataframe original.

    Para incluir las columnas ‘category’ y ‘duration’ en el dataframe de salida, simplemente debes agregarlas en la declaración del groupby de la siguiente manera:

    df['operation'] = df.groupby(['code', 'category', 'duration']).apply(calc_operation).reset_index(drop=True)
    

    Esto agrupará el dataframe por las columnas ‘code’, ‘category’ y ‘duration’ y aplicará la función personalizada a cada grupo. Los valores resultantes se concatenan y se devuelven en una nueva Serie, que luego asignamos a la columna ‘operation’ del dataframe original. El dataframe de salida ahora tendrá las cuatro columnas [‘code’, ‘industry’, ‘category’, ‘duration’, ‘operation’].

Comments are closed.