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