在Python的pandas库中,pivot_table和groupby是处理数据分组统计的两大核心工具,两者都能实现对数据的分组聚合计算,但在使用逻辑、输出结果形态和适用场景上有明显区别。理解两者的差异,能帮助我们在不同数据处理需求下做出更合适的选择。

pivot_table与groupby的核心差异
groupby是基于分组的聚合逻辑,核心思路是拆分、应用、合并,先按指定维度拆分数据,再对每个分组应用聚合函数,最后将结果合并输出。而pivot_table本质是透视表功能,会将行索引、列索引作为分组维度,自动生成二维交叉表形式的输出结果,更适合做多维度的交叉统计。
基础参数对比
| 对比项 | groupby | pivot_table |
|---|---|---|
| 核心逻辑 | 分组后聚合,输出一维或多维Series/DataFrame | 生成二维交叉透视表,输出DataFrame |
| 分组维度配置 | 通过by参数指定分组列 | 通过index(行分组)、columns(列分组)参数指定 |
| 聚合函数配置 | agg或直接使用聚合方法如sum、mean | 通过aggfunc参数指定 |
| 缺失值处理 | 默认忽略分组中的缺失值 | 可通过fill_value参数指定填充值 |
groupby实战用法
我们先构造一份销售数据作为示例,后续所有操作都基于这份数据展开。
import pandas as pd
# 构造示例销售数据
data = {
"region": ["华东", "华东", "华南", "华南", "华东", "华南"],
"category": ["电子", "服饰", "电子", "服饰", "电子", "服饰"],
"sales": [1200, 800, 1500, 900, 1100, 1000],
"month": [1, 1, 1, 1, 2, 2]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
单维度分组统计
如果只需要按单个维度分组计算总和,使用groupby非常简洁。
# 按region分组统计总销售额
region_sales = df.groupby("region")["sales"].sum()
print("按地区分组的总销售额:")
print(region_sales)
多维度分组统计
当需要按多个维度分组时,groupby的by参数可以传入列名列表,聚合结果会生成多层索引的Series。
# 按region和category两个维度分组统计总销售额
multi_group = df.groupby(["region", "category"])["sales"].sum()
print("多维度分组结果:")
print(multi_group)
自定义聚合函数
如果需要同时计算多个聚合指标,可以使用agg方法传入聚合函数列表。
# 按地区分组,同时计算销售额的总和、平均值、最大值
agg_result = df.groupby("region")["sales"].agg(["sum", "mean", "max"])
print("自定义聚合结果:")
print(agg_result)
pivot_table实战用法
同样基于前面的销售数据,我们来看pivot_table的典型使用场景。
基础透视表生成
如果要生成行是地区、列是品类的销售额汇总表,用pivot_table会比groupby更直观,直接得到二维表结构。
# 生成行分组为region,列分组为category的销售额透视表
pivot_result = df.pivot_table(
index="region", # 行分组维度
columns="category", # 列分组维度
values="sales", # 待聚合的数值列
aggfunc="sum" # 聚合函数
)
print("基础透视表结果:")
print(pivot_result)
处理缺失值与多聚合函数
pivot_table支持通过fill_value填充结果中的缺失值,也可以同时指定多个聚合函数,生成多层列索引的结果。
# 同时计算总和与平均值,缺失值填充为0
multi_agg_pivot = df.pivot_table(
index="region",
columns="category",
values="sales",
aggfunc=["sum", "mean"],
fill_value=0
)
print("多聚合函数透视表结果:")
print(multi_agg_pivot)
添加分组 margins 总计
如果需要同时显示行和列的总计数据,可以开启margins参数。
# 开启总计行和总计列
margin_pivot = df.pivot_table(
index="region",
columns="category",
values="sales",
aggfunc="sum",
margins=True,
margins_name="总计"
)
print("带总计的透视表结果:")
print(margin_pivot)
如何选择合适的方法
实际使用中可以根据需求选择:
- 如果只需要一维的分组聚合结果,或者后续需要继续链式调用pandas的其他方法,优先选择groupby,它的灵活性更高,支持更复杂的分组逻辑。
- 如果需要生成二维交叉统计表,或者需要快速查看多维度交叉的聚合结果,优先选择pivot_table,输出的表格结构更符合人工阅读习惯,也方便后续导出为Excel格式的报表。
另外需要注意,groupby的分组键如果包含缺失值,默认会忽略该分组;而pivot_table默认也会忽略缺失的分组键,若有特殊需求可以通过参数调整处理方式。两者都支持对分组后的结果进行过滤、转换操作,熟练掌握后能覆盖绝大多数数据分组统计的场景。
Pythonpandaspivot_tablegroupby数据分组统计修改时间:2026-06-24 23:39:39