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

时间:2018-03-12 22:34:27

标签: python pandas dataframe

我正在尝试计算数据子集的子集的平均值。

例如,假设我的数据是

 **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

所以我要做的是计算史密斯家族中女性的平均成绩。答案是(65 + 100)/ 2。

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

我的代码是:

numpy.mean(students.grade)

我也尝试过一种方法:

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

但是这种方法不可扩展,因为我必须手动输入每个姓氏。

我编制了数据;我实际上是用动物和人们对动物的评级来做的,但它的概念是相同的。

P.S。我正在使用Python。

6 个答案:

答案 0 :(得分:1)

您将在此处使用groupby

students[students['Family Name'] == 'Smith'].groupby('Gender').Grade.mean()

答案 1 :(得分: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

答案 2 :(得分: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()

Here's a linkpandas.DataFrame.groupby的文档。祝你好运!

答案 3 :(得分:0)

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

Groupby

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

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

答案 4 :(得分:0)

在我看来,你有一堆混乱的字符串,姓氏,性别和等级,根本没有组织,因此,你正在努力想象 如何理解这一切。这是面向对象编程非常出色的时期。

而不是存储一堆变量:

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

您可以使用三个实例变量创建一个名为Person的类:

    class Person:

        family_name

        gender

        grade

现在,你的类需要一个构造函数,所以你可以创建一个Person并告诉程序该特定Person的姓氏,性别和等级是什么。在你的代码中,你需要这样的东西:

    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循环,那么您应该获得所有史密斯女性所有等级的平均值。我希望你明白,如果我的语法错误,请有人纠正我 - 因为我使用过Python已经有一段时间了!

答案 5 :(得分:0)

你可以

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