19数据分组和汇总

admin2026-01-08 16:02:34世界杯比赛回放视频

19.7 使用 pandas.DataFrame.groupby() 进行分组汇总

现在让我们看看如何使用 groupby() 来获得分组汇总,这是使用 agg() 的主要原因。

顾名思义,pandas.DataFrame.groupby() 让您可以按变量中的值对数据框进行分组(例如,按性别分组为男性和女性)。然后,您可以执行按这些组拆分的操作。

让我们尝试按性别对 yao 数据框进行分组,并观察效果:

yao.groupby("sex")

嗯。显然没有发生任何事情。我们只是得到了一个 GroupBy 对象。

但是,当我们将 groupby() 与前一节中使用的 agg() 调用链式连接时,看看会发生什么:

yao.groupby("sex").agg(mean_age=("age", "mean"), median_age=("age", "median"))

mean_age

median_age

sex

Female

29.495446

26.0

Male

28.395735

25.0

现在我们为每个组获得了不同的统计数据!女性受访者的平均年龄约为 29.5 岁,而男性受访者的平均年龄约为 28.4 岁。

如前所述,这种分组汇总是 agg() 函数如此有用的主要原因。

您可能注意到有两行标题。这是因为输出具有层次索引(在 pandas 中称为 MultiIndex)。虽然在某些情况下这可能有用,但它通常会使进一步的数据操作更加困难。我们可以使用 reset_index() 方法重置索引,将组标签转换回常规列。

yao.groupby("sex").agg(mean_age=("age", "mean"), median_age=("age", "median")).reset_index()

sex

mean_age

median_age

0

Female

29.495446

26.0

1

Male

28.395735

25.0

您可能会注意到代码行变得相当长。我们可以将每个新的方法调用移到新的一行以提高代码的可读性,但需要将整个链包裹在括号中。

(

yao.groupby("sex")

.agg(mean_age=("age", "mean"), median_age=("age", "median"))

.reset_index()

)

sex

mean_age

median_age

0

Female

29.495446

26.0

1

Male

28.395735

25.0

让我们看一个例子。

假设您被要求获取不同社区中个体的最大和最小体重,并呈现每个社区中的个体数量。我们可以编写:

(

yao.groupby("neighborhood")

.agg(

max_weight=("weight_kg", "max"),

min_weight=("weight_kg", "min"),

count=("weight_kg", "size"), # the size function counts rows per group

)

.reset_index()

)

neighborhood

max_weight

min_weight

count

0

Briqueterie

128

20

106

1

Carriere

129

14

236

2

Cité Verte

118

16

72

...

...

...

...

...

6

Nkomkana

161

15

75

7

Tsinga

105

15

81

8

Tsinga Oliga

100

17

67

9 rows × 4 columns

练习

19.8 练习题:按性别分组的最小和最大身高

使用 groupby()、agg() 和相关的汇总函数,从 yao 数据框中获取每个性别的最小和最大身高,以及每个性别组中的个体数量。

您的输出应为如下所示的 DataFrame:

sex

min_height_cm

max_height_cm

count

Female

Male

# Your code here

友情链接