如何在Python中计算数据框的子集的子集的平均值?

4
我将尝试计算数据的一个子集的平均值,该子集是数据的另一个子集。
例如,假设我的数据如下:
 **Family Name / Gender / Grade**
    Smith / Male / 90
    Smith / Male / 85
    Smith / Female / 65
    Smith / Female / 100
    Johns / Male / 95
    Johns / Male / 45
    Johns / Female / 20
    Johns / Female / 100

我想要做的是计算Smith家族女性的平均分,答案应该是(65+100)/2。

我知道如何计算平均值,但我不知道如何两次将其分成子类别。

我的代码是:

numpy.mean(students.grade)

我还尝试了一种方法,其中我执行了:

smith_family = students[students['Family Name'] == 'Smith']
np.mean(smith_family.grades)

但这种方法不具有可扩展性,因为我必须手动输入每个姓氏。
我虚构了数据;实际上我在处理动物和人们对动物的评分,但是概念相同。
附注:我正在使用Python。
6个回答

2
你将在这里使用 groupby:
students[students['Family Name'] == 'Smith'].groupby('Gender').Grade.mean()

2

您可以

df.set_index(['FamilyName','Gender']).mean(level=[0,1])
Out[271]: 
                   Grade
FamilyName Gender       
Smith      Male     87.5
           Female   82.5
Johns      Male     70.0
           Female   60.0

0

使用groupby

students = pd.DataFrame({'Family Name': ['Smith', 'Smith', 'Smith', 'Smith', 'Johns', 'Johns', 'Johns', 'Johns'], 'Gender': ['Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Female', 'Female'], 'Grade': [90, 85, 65, 100, 95, 45, 20, 100]})

students.groupby(['Family Name', 'Gender']).mean()

这里是链接pandas.DataFrame.groupby文档。祝你好运!


0

在Pandas中使用Groupby方法。首先将数组转换为DataFrame对象:

df = pandas.DataFrame(values, index=index)

然后按姓氏分组,并计算每个组的平均值或总和。

df.groupby('Family Name').mean()


0

不需要逐个输入每个姓氏(正如您所提到的那样,这会很繁琐),您可以只需按名称列进行分组。此外,您可以使用性别进行第二级分组,以给出名称和性别的组合。然后计算每个子组的平均值:

import pandas as pd

df = pd.DataFrame({'Name': ['Smith', 'Smith', 'Smith', 'Smith', 'Johns', 'Johns', 'Johns', 'Johns'],
                   'Gender': ['Male', 'Male', 'Female', 'Female', 'Male', 'Male', 'Female', 'Female'],
                   'Grade': [90, 85, 65, 100, 95, 45, 20, 100]})

df.groupby(['Name', 'Gender']).mean()

这将给你:

              Grade
Name  Gender       
Johns Female   60.0
      Male     70.0
Smith Female   82.5
      Male     87.5

0

我看到你有一堆字符串,包括姓氏、性别和年级,它们没有任何组织,因此你很难弄清楚如何理解它们。这是面向对象编程非常出色的时候。

与其存储一堆变量:

    family_name_1 = "smith"
    gender_1 = "male"
    grade_1 = 95
    family_name_2 = "johns"
    #...

你可以创建一个名为Person的类,其中包含三个实例变量:
    class Person:

        family_name

        gender

        grade

现在,你的类需要一个构造函数,这样你就可以创建一个人并告诉程序这个特定人的姓氏、性别和年级是什么。在类的代码中,你需要像这样的东西:
    def __init__(self, family_name, gender, grade):
        self.family_name = family_name
        self.gender = gender
        self.grade = grade

现在,你已经完成了设置你的 Person 类。接下来,你要通过创建新的人来填充:

    bob = Person("smith", "male", 95)

这不仅比上面的更容易输入,而且您的代码现在更加有组织。接下来您需要一个人员列表,以便可以将他们平均:

    people = [Person("smith", "female", 97), Person("johns", "male", 60)] #...

为了计算所有人的平均成绩,我实际上不会使用numpy,而是像这样:

    total = 0
    number = 0
    for person in people:
        if person.gender == "female" and person.family_name == "smith":
            total += person.grade
            number += 1
    average = total / number
    print average

如果您将上述所有数据输入列表中,并使用我的for循环,您应该得到所有Smith女性的所有成绩的平均值。希望您能理解,如果我的语法有误,请有人纠正我 - 我已经有一段时间没有使用Python了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接