介绍
分组和聚合数据是数据分析中的基本操作。它们允许你根据特定标准将大型数据集拆分成更小的组,然后为每个组计算汇总统计信息。这个过程对于揭示模式、比较细分数据以及从原始数据中提取有意义的见解至关重要。
在 Python 数据分析库 Pandas 中,这种“拆分 - 应用 - 合并”(split-apply-combine)策略主要由强大的 groupby() 方法处理。在本实验中,你将学习如何使用 groupby() 来执行分组和聚合。你将从按单列分组数据开始,应用聚合函数,一次使用多个函数,按多列分组,最后将输出格式化为标准的 DataFrame。
使用 groupby 按单列分组
在此步骤中,你将学习 groupby() 方法的基本用法,该方法用于将 DataFrame 拆分成组。groupby() 方法本身不计算任何内容,而是返回一个 DataFrameGroupBy 对象。此对象包含了之后对每个组应用计算所需的所有信息。
首先,让我们按 Category 列对示例 DataFrame 进行分组。这将为 'Electronics'、'Clothing' 和 'Books' 创建不同的组。
在左侧编辑器中打开 main.py 文件。创建 DataFrame 的初始代码已存在。将以下代码添加到 main.py 文件的末尾:
## Group by the 'Category' column
grouped_by_category = df.groupby('Category')
## The result is a DataFrameGroupBy object
print("Type of the grouped object:")
print(type(grouped_by_category))
## To see the contents, you can iterate over the groups
print("\nIterating over groups to see their content:")
for name, group in grouped_by_category:
print(f"\nGroup: {name}")
print(group)
现在,从终端运行脚本以查看输出。
python3 main.py
你将看到原始 DataFrame,然后是 groupby 对象的类型,最后是每个组的内容。这表明 DataFrame 已根据 'Category' 列中的唯一值成功拆分。
Original DataFrame:
Category Region Sales Units
0 Electronics North 1200 10
1 Clothing South 800 25
2 Electronics North 1500 8
3 Books West 300 15
4 Clothing East 900 20
5 Books West 450 18
==============================
Type of the grouped object:
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
Iterating over groups to see their content:
Group: Books
Category Region Sales Units
3 Books West 300 15
5 Books West 450 18
Group: Clothing
Category Region Sales Units
1 Clothing South 800 25
4 Clothing East 900 20
Group: Electronics
Category Region Sales Units
0 Electronics North 1200 10
2 Electronics North 1500 8
对分组应用 sum 聚合
在此步骤中,你将学习如何对已创建的组应用聚合函数。在对数据分组后,最常见的下一步是计算每个组的某个值,例如 sum()、mean()、count() 或 max()。
让我们计算每个产品类别的总销售额。为此,你首先按 Category 分组,然后选择 Sales 列来应用 sum() 函数。
将以下代码添加到你的 main.py 文件的末尾。你可以移除上一步的 for 循环,以保持输出整洁。
## Group by 'Category' and calculate the sum of 'Sales' for each group
category_sales_sum = df.groupby('Category')['Sales'].sum()
print("Total sales per category:")
print(category_sales_sum)
保存文件并再次运行。
python3 main.py
输出现在将显示一个 Pandas Series,其中索引是类别名称,值是该类别的总销售额。
... (previous output) ...
Total sales per category:
Category
Books 750
Clothing 1700
Electronics 2700
Name: Sales, dtype: int64
这是汇总数据的强大而简洁的方式。你可以将相同的逻辑应用于其他数值列,或使用 mean() 等其他聚合函数来查找平均值。
使用 agg 聚合多个函数
在此步骤中,你将学习如何使用 agg() 方法同时将多个聚合函数应用于你的组。当你想要一次计算多个汇总统计量时,例如总销售额和平均销售额,这将非常有用。
agg() 方法可以接受一个字符串列表,其中每个字符串都是一个聚合函数的名称。让我们计算每个 Category 的 Sales 的 sum 和 mean。
将以下代码添加到你的 main.py 文件的末尾:
## Group by 'Category' and apply multiple aggregations on 'Sales'
category_agg = df.groupby('Category')['Sales'].agg(['sum', 'mean'])
print("\nSum and mean of sales per category:")
print(category_agg)
保存文件并执行。
python3 main.py
输出现在是一个 DataFrame。索引仍然是 Category,但列是分层的,显示了 Sales 数据的 sum 和 mean。
... (previous output) ...
Sum and mean of sales per category:
sum mean
Category
Books 750 375.0
Clothing 1700 850.0
Electronics 2700 1350.0
agg() 方法提供了一种灵活的方式来生成分组数据的全面摘要。
按多列分组
在此步骤中,你将学习如何按多列对 DataFrame 进行分组。这对于创建更细粒度的组以及分析不同类别之间的交互非常有用。为此,你只需将列名列表传递给 groupby() 方法。
让我们找出每个 Region 和 Category 组合的总销售额。这将向我们展示不同产品类别的销售额在不同区域的分布情况。
将以下代码添加到你的 main.py 文件的末尾:
## Group by multiple columns: 'Region' and 'Category'
multi_group_sum = df.groupby(['Region', 'Category'])['Sales'].sum()
print("\nTotal sales per Region and Category:")
print(multi_group_sum)
保存文件并运行脚本。
python3 main.py
输出将在行上有一个 MultiIndex,第一层是 Region,第二层是 Category。这提供了详细的销售额细分。
... (previous output) ...
Total sales per Region and Category:
Region Category
East Clothing 900
North Electronics 2700
South Clothing 800
West Books 750
Name: Sales, dtype: int64
如你所见,按多列分组可以对数据集进行更深入、更分层的分析。
重置分组后的 DataFrame 索引
在此步骤中,你将学习如何将分组后的输出转换回常规 DataFrame,其中分组键是列而不是索引。默认情况下,groupby() 会将分组键设置为结果 Series 或 DataFrame 的索引。有时,你可能需要一个“扁平化”的 DataFrame 以便进行进一步处理或可视化。
实现这一目标的最简单方法是在 groupby() 方法中使用 as_index=False 参数。
让我们重复步骤 2 中的单列分组,但这次我们将 Category 保留为常规列。
将以下代码添加到你的 main.py 文件的末尾:
## Group by 'Category' and aggregate, but keep 'Category' as a column
category_sales_flat = df.groupby('Category', as_index=False)['Sales'].sum()
print("\nGrouped data with 'Category' as a column:")
print(category_sales_flat)
保存文件并最后运行一次。
python3 main.py
观察输出。Category 不再是索引,而是现在新 DataFrame 的第一列,并且该 DataFrame 具有标准的整数索引(0、1、2)。
... (previous output) ...
Grouped data with 'Category' as a column:
Category Sales
0 Books 750
1 Clothing 1700
2 Electronics 2700
这种格式通常对于后续的数据操作任务更方便。另一种方法是在分组结果上调用 .reset_index(),这可以达到相同的效果。
总结
恭喜你完成了关于 Pandas 分组和聚合的这个实验!你已经学习了 Pandas 库中用于数据分析最强大且最常用的功能之一。
在此实验中,你练习了:
- 使用
df.groupby('column_name')将 DataFrame 分割成组。 - 对分组应用单个聚合函数,如
.sum()。 - 使用
.agg()方法一次应用多个聚合函数。 - 通过
df.groupby(['col1', 'col2'])按多列分组以创建分层摘要。 - 使用
as_index=False参数从groupby操作创建扁平化 DataFrame。
掌握这些技术是使用 Python 和 Pandas 进行数据处理和分析并变得熟练的关键一步。



