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.

Conflictos en el cálculo del promedio y la suma en Python Pandas.

Tengo una tabla que se ve así:

table

Las filas Average y Total se calculan así:

df1.loc["Average"] = df1.mean()
df1.loc["Total"] = df1.sum()

Ahora me di cuenta de que el problema aquí es que Average se está calculando correctamente, pero la suma también está incluyendo la fila Average, lo cual no es lo que quiero.

Idealmente, me gustaría ver algo más como una sola fila .loc que tenga sum() aplicado a

columns ['Enageable R', 'R Responses', 'R Response Rate', 'Engageable Q',
'Q Responses', 'Q Response Rate']

y mean() aplicado a columns ['R Response Rate', 'Q Response Rate']

Así que me encantaría ver algo así:

|      Brand      |     Engageable R    |    R Responses     |     Response Rate    |
|---------------------|------------------|------------------|------------------|
|          Brand1         |         34       |         34       |         100.00%       |
|          Brand2         |         34       |         34       |         100.00%       |
|          Brand3                  |         34       |         34       |        100.00%       |
|          Total         |         102       |         102       |         100.00%       |
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, podemos usar las funciones sum y mean directamente en las columnas deseadas del dataframe utilizando la función iloc para seleccionar las filas y columnas por su posición entera. Luego, podemos crear un nuevo dataframe con las etiquetas de fila deseadas y concatenarlas utilizando la función concat con axis=0 para agregarlo como una nueva fila al dataframe original.

    Aquí hay un ejemplo del código para lograr esto:

    import pandas as pd
    
    # create sample dataframe
    data = {'Brand': ['Brand1', 'Brand2', 'Brand3'],
            'Engageable R': [34, 34, 34],
            'R Responses': [34, 34, 34],
            'R Response Rate': ['100.00%', '100.00%', '100.00%'],
            'Engageable Q': [38, 38, 38],
            'Q Responses': [38, 38, 38],
            'Q Response Rate': ['100.00%', '100.00%', '100.00%']}
    df = pd.DataFrame(data)
    
    # calculate sum and mean values
    sum_vals = df.iloc[:, 1:7].sum()
    mean_vals = df.iloc[:, [3, 6]].mean()
    
    # create new dataframe with desired row labels
    new_row = pd.DataFrame({'Brand': ['Total'], 
                            'Engageable R': [sum_vals[0]], 
                            'R Responses': [sum_vals[1]], 
                            'R Response Rate': [sum_vals[2]], 
                            'Engageable Q': [sum_vals[3]], 
                            'Q Responses': [sum_vals[4]], 
                            'Q Response Rate': [sum_vals[5]]})
    
    # update values for mean columns
    new_row.iloc[:, [3, 6]] = mean_vals
    
    # concatenate new row to original dataframe
    df = pd.concat([df, new_row], axis=0)
    
    # format response rate columns as percentages
    df['R Response Rate'] = df['R Response Rate'].apply(lambda x: '{:.2f}%'.format(float(x[:-1])))
    df['Q Response Rate'] = df['Q Response Rate'].apply(lambda x: '{:.2f}%'.format(float(x[:-1])))
    
    # display final dataframe
    df
    

    Esto debería producir el resultado deseado:

         Brand  Engageable R  R Responses R Response Rate  Engageable Q  \
    0   Brand1            34           34         100.00%            38   
    1   Brand2            34           34         100.00%            38   
    2   Brand3            34           34         100.00%            38   
    0    Total           102          102         100.00%           114   
    
       Q Responses Q Response Rate  
    0           38         100.00%  
    1           38         100.00%  
    2           38         100.00%  
    0          114         100.00%  
    

Comments are closed.