Pandas Groupby 가중 평균

Salman Mehmood 2023년6월21일
  1. Pandas DataFrame의 가중 평균 계산
  2. Groupby 기능을 사용하여 Pandas에서 가중 평균 그룹화
Pandas Groupby 가중 평균

이 기사에서는 Pandas DataFrame의 가중 평균을 계산하는 방법을 배웁니다. 또한 Pandas DataFrame의 가중 평균을 그룹화하는 방법에 대해서도 설명합니다.

Pandas DataFrame의 가중 평균 계산

Pandas를 pd로 가져온 후 간단한 DataFrame을 만듭니다. 당신이 선생님이고 학생들의 점수를 평가한다고 상상해 봅시다.

전반적으로 Quiz_1, Quiz_2Quiz_3의 세 가지 다른 평가가 있습니다.

코드 예:

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

출력:

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

코드 예:

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

출력:

60.0

이러한 평가는 가중치에 따라 전체 점수에 다르게 영향을 미쳐야 합니다. 따라서 표본 평균 대신 가중 평균을 계산하려고 합니다.

먼저 Student_Score에 값을 곱한 다음 결과를 가중치의 총합으로 나누어야 하며 이것이 Pandas에서 구현할 수 있는 방법이기도 합니다.

Pandas 라이브러리를 사용하면 벡터화된 계산을 수행할 수 있으므로 Student_Score에 가중치를 곱하고 합계를 계산할 수 있습니다. 그런 다음 결과를 가중치의 합으로 나누어야 합니다.

코드 예:

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

이 DataFrame의 경우 가중 평균은 다음과 같습니다.

70.0

Groupby 기능을 사용하여 Pandas에서 가중 평균 그룹화

다음 예에서는 다른 학생에 대해 다른 열을 추가했습니다. 그래서 우리는 여기에 JohnJack 학생들이 있습니다.

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

출력:

   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

학생 Jack에 대해서만 가중 평균을 계산한다고 가정해 봅시다. 이 경우 여기에서 query() 메서드를 사용하여 수행한 것처럼 데이터를 필터링할 수 있습니다.

필터링된 DataFrame은 다음과 같습니다.

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

출력:

   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

이를 통해 이전과 동일한 계산을 적용할 수 있지만 이번에는 필터링된 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

출력:

33.333333333333336

그러나 이 방법은 특히 더 큰 데이터 세트를 처리할 때 지루할 수 있습니다. 예를 들어 100명의 학생이 있고 각 학생의 가중 평균을 계산하려고 합니다.

우리의 경우 데이터 세트에 학생을 한 명 더 추가했습니다.

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

출력:

   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

그러나 다음 방법은 데이터 세트에 포함될 수 있는 많은 학생과 관계없이 작동합니다. 이번에는 Groupby_weighted_avg()라는 작은 도우미 함수를 작성합니다.

이 함수는 가중 평균을 그룹화하려는 values, weighted_valueGroup_Cols라는 열 이름의 세 가지 매개변수를 사용합니다. 계산 방법은 이전과 매우 유사합니다. 유일한 차이점은 groupby() 메서드와 결합한다는 것입니다.

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

Groupby_weighted_avg() 함수를 사용하여 이제 값(예제에서는 Student_ScoreStd_score_Weight)을 전달할 수 있습니다. 결과를 Three_Student로 그룹화하려고 합니다.

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

위의 줄을 실행하면 각 학생의 가중 평균을 포함하는 새로운 DataFrame이 생성됩니다.

Three_Student
Harry    65.833333
Jack     38.333333
John     61.666667
dtype: float64

완전한 소스 코드:

# 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

관련 문장 - Pandas Groupby