Pandas Groupby gewichteter Durchschnitt

Salman Mehmood 21 Juni 2023
  1. Berechnen Sie den gewichteten Durchschnitt von Pandas DataFrame
  2. Verwenden Sie die Groupby-Funktion, um den gewichteten Durchschnitt in Pandas zu gruppieren
Pandas Groupby gewichteter Durchschnitt

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"],
)
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

Verwandter Artikel - Pandas Groupby