Pandas 分组与聚合

PandasBeginner
立即练习

介绍

分组和聚合数据是数据分析中的基本操作。它们允许你根据特定标准将大型数据集拆分成更小的组,然后为每个组计算汇总统计信息。这个过程对于揭示模式、比较细分数据以及从原始数据中提取有意义的见解至关重要。

在 Python 数据分析库 Pandas 中,这种“拆分 - 应用 - 合并”(split-apply-combine)策略主要由强大的 groupby() 方法处理。在本实验中,你将学习如何使用 groupby() 来执行分组和聚合。你将从按单列分组数据开始,应用聚合函数,一次使用多个函数,按多列分组,最后将输出格式化为标准的 DataFrame。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 91%。获得了学习者 100% 的好评率。

使用 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() 方法可以接受一个字符串列表,其中每个字符串都是一个聚合函数的名称。让我们计算每个 CategorySalessummean

将以下代码添加到你的 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 数据的 summean

... (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() 方法。

让我们找出每个 RegionCategory 组合的总销售额。这将向我们展示不同产品类别的销售额在不同区域的分布情况。

将以下代码添加到你的 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 进行数据处理和分析并变得熟练的关键一步。