在Pandas的数据处理流程中,多级分组聚合是处理多维度统计需求的核心操作,能够同时按照多个字段对数据集进行拆分,再对每个分组应用不同的聚合逻辑,输出符合分析要求的统计结果,广泛应用于业务报表生成、用户行为分析等场景。

多级分组聚合的基础实现
Pandas中实现多级分组的核心是使用groupby方法传入多个分组字段,分组字段可以是列名组成的列表,之后结合agg方法指定每个字段的聚合规则。首先我们需要准备测试数据集,示例代码如下:
import pandas as pd
# 构造测试数据
data = {
"region": ["华东", "华东", "华南", "华南", "华东", "华南"],
"category": ["电子", "服饰", "电子", "服饰", "电子", "服饰"],
"sales": [1200, 800, 1500, 900, 1100, 1000],
"profit": [300, 200, 400, 250, 280, 300]
}
df = pd.DataFrame(data)
print(df)
上述代码生成的数据集包含区域、品类、销售额、利润四个字段,接下来我们按照区域和品类两个维度进行分组,同时计算销售额的总和与平均值、利润的总和,基础实现代码如下:
# 多级分组聚合基础用法
result = df.groupby(["region", "category"]).agg(
sales_sum=("sales", "sum"),
sales_mean=("sales", "mean"),
profit_sum=("profit", "sum")
)
print(result)
执行后得到的分组结果会以区域和品类作为复合索引,每个分组对应一行统计结果,清晰展示不同区域下不同品类的销售和利润情况。
自定义聚合函数与多规则适配
除了使用Pandas内置的聚合函数(如sum、mean、count等),我们还可以在多级分组中应用自定义函数,满足特殊的统计需求。比如我们需要计算每个分组销售额的标准差,同时统计利润的最大值和最小值,示例代码如下:
# 自定义聚合函数
def calc_sales_std(series):
return series.std()
# 多级分组应用自定义函数
result_custom = df.groupby(["region", "category"]).agg(
sales_std=("sales", calc_sales_std),
profit_max=("profit", "max"),
profit_min=("profit", "min")
)
print(result_custom)
如果需要对同一个字段应用多种聚合规则,也可以使用更简洁的写法,比如同时计算销售额的总和、平均值、最大值:
# 同一字段多聚合规则 result_multi = df.groupby(["region", "category"])["sales"].agg(["sum", "mean", "max"]) print(result_multi)
分组结果的结构调整技巧
多级分组默认生成的复合索引有时不便于后续的数据处理,我们可以通过重置索引或者调整索引层级来优化结果结构。如果需要将复合索引转为普通列,可以使用reset_index方法:
# 重置索引,将分组字段转为普通列 result_reset = result.reset_index() print(result_reset)
如果需要交换复合索引的层级顺序,可以使用swaplevel方法,示例代码如下:
# 交换索引层级,先品类后区域
result_swap = result.swaplevel("category", "region")
print(result_swap)
复杂分析场景的实用技巧
分组后过滤数据
在多级分组聚合之后,我们可能需要过滤掉不符合条件的分组,比如只保留销售额总和大于2000的分组,可以使用filter方法实现:
# 分组后过滤,保留销售额总和大于2000的分组 filtered_result = df.groupby(["region", "category"]).filter(lambda x: x["sales"].sum() > 2000) print(filtered_result)
交叉表与透视表结合
对于多级分组的多维度分析需求,也可以结合pivot_table方法实现更灵活的结果展示,比如生成区域为行、品类为列、销售额为值的透视表:
# 透视表实现多维度聚合
pivot_result = pd.pivot_table(
df,
values="sales",
index="region",
columns="category",
aggfunc="sum",
fill_value=0
)
print(pivot_result)
分组结果排序
多级分组后的结果可以按照指定字段进行排序,比如按照销售额总和降序排列,示例代码如下:
# 按照销售额总和降序排序 result_sorted = result.sort_values(by="sales_sum", ascending=False) print(result_sorted)
注意事项
在使用多级分组聚合时,需要注意分组字段的数据类型,如果分组字段存在缺失值,默认情况下缺失值对应的行会被自动排除在分组之外,如果需要保留缺失值分组,可以在groupby方法中设置dropna=False。另外,自定义聚合函数需要能够接收Series类型的输入并返回标量值,否则会抛出类型错误。