Pandas Groupby Promedio ponderado

Salman Mehmood 21 junio 2023
  1. Calcule el promedio ponderado de Pandas DataFrame
  2. Use la función Groupby para agrupar el promedio ponderado en Pandas
Pandas Groupby Promedio ponderado

En este artículo, aprenderemos cómo calcular un promedio ponderado de Pandas DataFrame. También discutimos cómo agrupar el promedio ponderado de Pandas DataFrame.

Calcule el promedio ponderado de Pandas DataFrame

Después de importar pandas como pd, crearemos un DataFrame simple. Imaginemos que usted es un maestro y está evaluando los puntajes de sus alumnos.

En general, hay tres evaluaciones diferentes: Cuestionario_1, Cuestionario_2 y Cuestionario_3.

Ejemplo de código:

import pandas as pd
import numpy as np

Student_DF = pd.DataFrame(
    {
        "Student_Score": [30, 60, 90],
        "Std_score_Weight": [1, 2, 3],
        "Student_Assessment": ["Quiz_1", "Quiz_2", "Quiz_3"],
    }
)
Student_DF

Producción :

   Student_Score  Std_score_Weight Student_Assessment
0             30                 1             Quiz_1
1             60                 2             Quiz_2
2             90                 3             Quiz_3

Ejemplo de código:

Student_Average = Student_DF["Student_Score"].mean()
Student_Average

Producción :

60.0

Esas evaluaciones deberían influir en el puntaje general de manera diferente según su peso. Entonces, queremos calcular el promedio ponderado en lugar de la media muestral.

Primero, multiplicamos el Student_Score por los valores, luego debemos dividir el resultado por la suma total de los pesos, y así es como también podríamos implementarlo en Pandas.

Como la biblioteca de Pandas nos permite hacer cálculos vectorizados, podemos multiplicar el Student_Score por el peso y calcular la suma. Entonces necesitamos dividir el resultado por la suma de los pesos.

Ejemplo de código:

Std_weighted_avg = (
    Student_DF["Student_Score"] * Student_DF["Std_score_Weight"]
).sum() / Student_DF["Std_score_Weight"].sum()
Std_weighted_avg

Para este DataFrame, el promedio ponderado sería el siguiente.

70.0

Use la función Groupby para agrupar el promedio ponderado en Pandas

Para el siguiente ejemplo, agregamos otra columna para los diferentes estudiantes. Entonces, tenemos a los estudiantes John y Jack aquí.

Student_DF = pd.DataFrame(
    {
        "Student_Score": [30, 50, 90, 40, 50, 20],
        "Std_score_Weight": [1, 2, 3, 1, 2, 3],
        "Two_Students": ["John", "John", "John", "Jack", "Jack", "Jack"],
        "Students_Assessment": [
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
        ],
    }
)
Student_DF

Producción :

   Student_Score  Std_score_Weight Two_Students Students_Assessment
0             30                 1         John              Quiz_1
1             50                 2         John              Quiz_2
2             90                 3         John              Quiz_3
3             40                 1         Jack              Quiz_1
4             50                 2         Jack              Quiz_2
5             20                 3         Jack              Quiz_3

Supongamos que queremos calcular el promedio ponderado solo para el estudiante Jack. En ese caso, podríamos filtrar nuestros datos, como hicimos aquí con el método query().

El DataFrame filtrado se verá así.

Filtered_by_Jack = Student_DF.query("Two_Students == 'Jack'")
Filtered_by_Jack

Producción :

   Student_Score  Std_score_Weight Two_Students Students_Assessment
3             40                 1         Jack              Quiz_1
4             50                 2         Jack              Quiz_2
5             20                 3         Jack              Quiz_3

Con eso en su lugar, podemos aplicar el mismo cálculo que antes, pero esta vez en el DataFrame filtrado.

Std_weighted_avg = (
    Filtered_by_Jack["Student_Score"] * Filtered_by_Jack["Std_score_Weight"]
).sum() / Filtered_by_Jack["Std_score_Weight"].sum()
Std_weighted_avg

Producción :

33.333333333333336

Sin embargo, este método puede volverse tedioso, especialmente cuando se trata de un conjunto de datos más grande. Por ejemplo, 100 estudiantes y desea calcular el promedio ponderado para cada estudiante.

En nuestro caso, acabamos de agregar un estudiante más al conjunto de datos.

Student_DF = pd.DataFrame(
    {
        "Student_Score": [20, 40, 90, 80, 60, 10, 5, 60, 90],
        "Std_score_Weight": [1, 2, 3, 1, 2, 3, 1, 2, 3],
        "Three_Student": [
            "John",
            "John",
            "John",
            "Jack",
            "Jack",
            "Jack",
            "Harry",
            "Harry",
            "Harry",
        ],
        "Students_Assessment": [
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
        ],
    }
)
Student_DF

Producción :

   Student_Score  Std_score_Weight Three_Student Students_Assessment
0             20                 1          John              Quiz_1
1             40                 2          John              Quiz_2
2             90                 3          John              Quiz_3
3             80                 1          Jack              Quiz_1
4             60                 2          Jack              Quiz_2
5             10                 3          Jack              Quiz_3
6              5                 1         Harry              Quiz_1
7             60                 2         Harry              Quiz_2
8             90                 3         Harry              Quiz_3

Pero, el siguiente método también funcionará independientemente de la cantidad de estudiantes que pueda contener el conjunto de datos. Esta vez, escribiremos una pequeña función auxiliar llamada Groupby_weighted_avg().

La función toma tres parámetros: los valores, weighted_value y el nombre de la columna llamada Group_Cols, que queremos agrupar la media ponderada. El método de cálculo es muy similar al anterior; la única diferencia es que lo combinamos con el método groupby().

def Groupby_weighted_avg(values, weighted_value, Group_Cols):
    return (values * weighted_value).groupby(Group_Cols).sum() / weighted_value.groupby(
        Group_Cols
    ).sum()

Con nuestra función Groupby_weighted_avg() en su lugar, ahora podemos pasar los valores, que son Student_Score en nuestro ejemplo, y Std_score_Weight. Queremos agrupar el resultado por Three_Student.

Groupby_weighted_avg(
    Student_DF["Student_Score"],
    Student_DF["Std_score_Weight"],
    Student_DF["Three_Student"],
)

Después de ejecutar la línea anterior, tendremos un nuevo DataFrame que contiene el promedio ponderado de cada estudiante.

Three_Student
Harry    65.833333
Jack     38.333333
John     61.666667
dtype: float64

Código fuente completo:

# In[1]:
import pandas as pd
import numpy as np

Student_DF = pd.DataFrame(
    {
        "Student_Score": [30, 60, 90],
        "Std_score_Weight": [1, 2, 3],
        "Student_Assessment": ["Quiz_1", "Quiz_2", "Quiz_3"],
    }
)
Student_DF

# In[2]:
Student_Average = Student_DF["Student_Score"].mean()
Student_Average

# In[3]:
Std_weighted_avg = (
    Student_DF["Student_Score"] * Student_DF["Std_score_Weight"]
).sum() / Student_DF["Std_score_Weight"].sum()
Std_weighted_avg

# In[4]:
# groupby
Student_DF = pd.DataFrame(
    {
        "Student_Score": [30, 50, 90, 40, 50, 20],
        "Std_score_Weight": [1, 2, 3, 1, 2, 3],
        "Two_Students": ["John", "John", "John", "Jack", "Jack", "Jack"],
        "Students_Assessment": [
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
        ],
    }
)
Student_DF

# In[5]:
Filtered_by_Jack = Student_DF.query("Two_Students == 'Jack'")
Filtered_by_Jack

# In[6]:
Std_weighted_avg = (
    Filtered_by_Jack["Student_Score"] * Filtered_by_Jack["Std_score_Weight"]
).sum() / Filtered_by_Jack["Std_score_Weight"].sum()
Std_weighted_avg

# In[7]:
Student_DF = pd.DataFrame(
    {
        "Student_Score": [20, 40, 90, 80, 60, 10, 5, 60, 90],
        "Std_score_Weight": [1, 2, 3, 1, 2, 3, 1, 2, 3],
        "Three_Student": [
            "John",
            "John",
            "John",
            "Jack",
            "Jack",
            "Jack",
            "Harry",
            "Harry",
            "Harry",
        ],
        "Students_Assessment": [
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
            "Quiz_1",
            "Quiz_2",
            "Quiz_3",
        ],
    }
)
Student_DF

# In[8]:


def Groupby_weighted_avg(values, weighted_value, Group_Cols):
    return (values * weighted_value).groupby(Group_Cols).sum() / weighted_value.groupby(
        Group_Cols
    ).sum()


# In[9]:
Groupby_weighted_avg(
    Student_DF["Student_Score"],
    Student_DF["Std_score_Weight"],
    Student_DF["Three_Student"],
)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

Artículo relacionado - Pandas Groupby