Pandas Groupby Promedio ponderado
- Calcule el promedio ponderado de Pandas DataFrame
-
Use la función
Groupby
para agrupar el promedio ponderado en Pandas
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"],
)
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