Pandas Groupby gewichteter Durchschnitt
- Berechnen Sie den gewichteten Durchschnitt von Pandas DataFrame
-
Verwenden Sie die
Groupby
-Funktion, um den gewichteten Durchschnitt in Pandas zu gruppieren
In diesem Artikel erfahren Sie, wie Sie einen gewichteten Durchschnitt von Pandas DataFrame berechnen. Wir besprechen auch, wie der gewichtete Durchschnitt von Pandas DataFrame gruppiert wird.
Berechnen Sie den gewichteten Durchschnitt von Pandas DataFrame
Nachdem wir Pandas als pd
importiert haben, erstellen wir einen einfachen DataFrame. Stellen wir uns vor, Sie sind ein Lehrer und werten die Ergebnisse Ihrer Schüler aus.
Insgesamt gibt es drei verschiedene Auswertungen: Quiz_1
, Quiz_2
und Quiz_3
.
Codebeispiel:
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
Ausgang:
Student_Score Std_score_Weight Student_Assessment
0 30 1 Quiz_1
1 60 2 Quiz_2
2 90 3 Quiz_3
Codebeispiel:
Student_Average = Student_DF["Student_Score"].mean()
Student_Average
Ausgang:
60.0
Je nach Gewicht sollten diese Bewertungen die Gesamtpunktzahl unterschiedlich beeinflussen. Wir möchten also den gewichteten Durchschnitt anstelle des Stichprobenmittelwerts berechnen.
Zuerst multiplizieren wir den Student_Score
mit den Werten, dann müssen wir das Ergebnis durch die Gesamtsumme der Gewichte dividieren, und so könnten wir es auch in Pandas umsetzen.
Da uns die Pandas-Bibliothek vektorisierte Berechnungen erlaubt, können wir den Student_Score
mit dem Gewicht multiplizieren und die Summe berechnen. Dann müssen wir das Ergebnis durch die Summe der Gewichte dividieren.
Codebeispiel:
Std_weighted_avg = (
Student_DF["Student_Score"] * Student_DF["Std_score_Weight"]
).sum() / Student_DF["Std_score_Weight"].sum()
Std_weighted_avg
Für diesen DataFrame wäre der gewichtete Durchschnitt wie folgt.
70.0
Verwenden Sie die Groupby
-Funktion, um den gewichteten Durchschnitt in Pandas zu gruppieren
Für das nächste Beispiel haben wir eine weitere Spalte für die verschiedenen Schüler hinzugefügt. Wir haben hier also die Schüler John
& Jack
.
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
Ausgang:
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
Nehmen wir an, wir wollen den gewichteten Durchschnitt nur für den Schüler Jack
berechnen. In diesem Fall könnten wir unsere Daten filtern, wie wir es hier mit der Methode query()
getan haben.
Der gefilterte DataFrame sieht folgendermaßen aus.
Filtered_by_Jack = Student_DF.query("Two_Students == 'Jack'")
Filtered_by_Jack
Ausgang:
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
Damit können wir dieselbe Berechnung wie zuvor anwenden, diesmal jedoch auf den gefilterten DataFrame.
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
Ausgang:
33.333333333333336
Diese Methode kann jedoch mühsam werden, insbesondere wenn es sich um einen größeren Datensatz handelt. Beispiel: 100 Schüler, und Sie möchten den gewichteten Durchschnitt für jeden Schüler berechnen.
In unserem Fall haben wir dem Datensatz gerade einen weiteren Schüler hinzugefügt.
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
Ausgang:
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
Die folgende Methode funktioniert jedoch auch unabhängig davon, wie viele Schüler der Datensatz möglicherweise enthält. Dieses Mal schreiben wir eine kleine Hilfsfunktion namens Groupby_weighted_avg()
.
Die Funktion nimmt drei Parameter: die values
, weighted_value
und den Spaltennamen namens Group_Cols
, die wir den gewichteten Durchschnitt gruppieren wollen. Die Berechnungsmethode ist der vorherigen sehr ähnlich; Der einzige Unterschied besteht darin, dass wir es mit der Methode groupby()
kombinieren.
def Groupby_weighted_avg(values, weighted_value, Group_Cols):
return (values * weighted_value).groupby(Group_Cols).sum() / weighted_value.groupby(
Group_Cols
).sum()
Mit unserer Funktion Groupby_weighted_avg()
können wir nun die Werte übergeben, in unserem Beispiel Student_Score
und Std_score_Weight
. Wir wollen das Ergebnis nach Three_Student
gruppieren.
Groupby_weighted_avg(
Student_DF["Student_Score"],
Student_DF["Std_score_Weight"],
Student_DF["Three_Student"],
)
Nachdem Sie die obige Zeile ausgeführt haben, haben wir einen neuen DataFrame, der den gewichteten Durchschnitt für jeden Schüler enthält.
Three_Student
Harry 65.833333
Jack 38.333333
John 61.666667
dtype: float64
Vollständiger Quellcode:
# 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