应用聚合函数首先需要通过在 DataFrame 上调用 groupby() 方法来创建 GroupBy 对象。然后,下一步是对每个组应用一个函数以计算汇总统计量。这一操作是“拆分-应用-合并”模式中的“应用”部分。Pandas 的 GroupBy 对象内置了多个聚合方法,它们与 Series 和 DataFrame 上的对应方法功能非常相似。这些方法会自动独立地对每个组进行操作,然后将结果合并到一个新的 Series 或 DataFrame 中。让我们看一个简单的数据框,它表示不同产品在各个区域的销售数据:import pandas as pd import numpy as np # 示例数据 data = {'Region': ['North', 'South', 'North', 'South', 'East', 'East', 'North'], 'Product': ['A', 'A', 'B', 'B', 'A', 'C', 'B'], 'Sales': [100, 150, 200, 50, 120, 80, 180], 'Quantity': [10, 15, 20, 5, 12, 8, 15]} df = pd.DataFrame(data) print("原始数据框:") print(df)原始数据框: Region Product Sales Quantity 0 North A 100 10 1 South A 150 15 2 North B 200 20 3 South B 50 5 4 East A 120 12 5 East C 80 8 6 North B 180 15现在,让我们按“Region”对这些数据进行分组:grouped_by_region = df.groupby('Region')grouped_by_region 对象现在包含已分离的组,但我们尚未进行任何计算。常用聚合函数您可以直接将常用聚合函数应用于 GroupBy 对象。Pandas 会智能地将函数应用于每个组中合适的列(通常是数值列)。求和 (.sum()):计算每个组的值的总和。# 计算每个区域的总销售额和总数量 region_totals = grouped_by_region.sum() print("\n每个区域的总销售额和总数量:") print(region_totals)每个区域的总销售额和总数量: Sales Quantity Region East 200 20 North 480 45 South 200 20请注意,输出是一个新的数据框,其中索引是分组键(“Region”),列是原始数据框中的数值列(“Sales”、“Quantity”),包含每个区域的总和值。非数值的“Product”列自动从求和中排除。平均值 (.mean()):计算每个组的平均值。# 计算每个区域的平均销售额和平均数量 region_means = grouped_by_region.mean() print("\n每个区域的平均销售额和平均数量:") print(region_means)每个区域的平均销售额和平均数量: Sales Quantity Region East 100.000000 10.000000 North 160.000000 15.000000 South 100.000000 10.000000同样,输出索引是“Region”,值代表属于每个区域的行的“Sales”和“Quantity”的平均值。计数 (.count()):计算每个组中每列的非空条目数。# 计算每个区域每列的条目数 region_counts = grouped_by_region.count() print("\n每个区域的条目数:") print(region_counts)每个区域的条目数: Product Sales Quantity Region East 2 2 2 North 3 3 3 South 2 2 2这里,count() 包含“Product”列,因为它计算任何非缺失值,无论数据类型如何。它显示了有多少记录属于每个区域的组。大小 (.size()):返回每个组的总行数(包括空值,与 count() 不同)。# 获取每个区域的总行数(大小) region_sizes = grouped_by_region.size() print("\n每个区域组的大小:") print(region_sizes)每个区域组的大小: Region East 2 North 3 South 2 dtype: int64size() 的输出是一个 Pandas Series,其中索引是分组键(“Region”),值是属于该组的行数。最小值 (.min()) 和最大值 (.max()):找出每个组中每个适用列的最小值或最大值。# 找出每个区域的最小销售额 region_min_sales = grouped_by_region['Sales'].min() # 应用于特定列 print("\n每个区域的最小销售额:") print(region_min_sales) # 找出每个区域的最大数量 region_max_quantity = grouped_by_region['Quantity'].max() print("\n每个区域的最大数量:") print(region_max_quantity)每个区域的最小销售额: Region East 80 North 100 South 50 Name: Sales, dtype: int64 每个区域的最大数量: Region East 12 North 20 South 15 Name: Quantity, dtype: int64在这些示例中,我们首先从 GroupBy 对象中选择一个特定列(['Sales'] 或 ['Quantity']),然后再应用聚合。这会得到一个 Series,其中索引是分组键(“Region”),值是该组所选列的最小/最大值。如果您在未首先选择列的情况下直接将 .min() 或 .max() 应用于 GroupBy 对象,它将计算所有适用(通常是数值)列的最小/最大值,类似于 .sum() 或 .mean()。应用于特定列正如在 .min() 和 .max() 中所见的,您可以在分组后将聚合函数应用于特定列。当您只需要某些特征的汇总时,这很有用。# 计算每个区域的总销售额 total_sales_per_region = df.groupby('Region')['Sales'].sum() print("\n每个区域的总销售额(特定列):") print(total_sales_per_region) # 计算每个产品的平均数量 avg_quantity_per_product = df.groupby('Product')['Quantity'].mean() print("\n每个产品的平均数量:") print(avg_quantity_per_product)每个区域的总销售额(特定列): Region East 200 North 480 South 200 Name: Sales, dtype: int64 每个产品的平均数量: Product A 12.333333 B 13.333333 C 8.000000 Name: Quantity, dtype: float64在聚合之前选择列 (df.groupby('Region')['Sales'].sum()) 通常比计算所有列的聚合然后选择您需要的列 (df.groupby('Region').sum()['Sales']) 更有效,尤其是在大型数据集上。这些基本聚合函数(sum、mean、count、size、min、max、std、var、median 等)涵盖了许多常见的数据汇总任务。它们是理解 Pandas 中按组操作的基本要素。在下一节中,我们将学习如何一次应用多个聚合函数。