多层级维度交叉统计、分组求和均值计数多指标同表展示,普通groupby多层嵌套代码冗余,透视表一键生成标准业务宽表。
场景:以地区为行、商品品类为列,统计销售额总和、平均单价、独立下单用户数量,生成交叉透视报表。核心知识点:透视表行列维度配置、多聚合函数并行、缺失填充、汇总行/列自动生成。
② 生成测试数据
import pandas as pdimport numpy as npnp.random.seed(66)df = pd.DataFrame({ "region": np.random.choice(["华东","华北","华南","西南"], 220), "category": np.random.choice(["数码","家居","美妆"], 220), "order_amount": np.random.uniform(120, 6800, 220).round(2), "user_id": np.random.randint(1000, 1120, 220), "sale_date": pd.date_range("2026-01-01", periods=220, freq="D")})df.to_excel("pivot_sales_data.xlsx", index=False)print("透视表交叉统计测试数据生成完成")
③ 核心代码
import pandas as pd# 读取数据df = pd.read_excel("pivot_sales_data.xlsx")# 1. 生成透视表(不含总计)pivot_df = pd.pivot_table( data=df, index="region", columns="category", values=["order_amount", "user_id"], aggfunc={ "order_amount": ["sum", "mean"], "user_id": ["nunique"] }, fill_value=0, margins=False)# 2. 提取行索引和列层级信息row_index = pivot_df.index.tolist() # 地区列表col_tuples = pivot_df.columns.tolist() # 多层列索引元组列表# 3. 生成扁平列名(格式:指标_聚合_品类)flat_columns = []for tup in col_tuples: # tup 例如 ('order_amount', 'sum', '数码') parts = [str(x) for x in tup if x not in (None, "")] flat_columns.append("_".join(parts))# 4. 获取数据矩阵data_matrix = pivot_df.values# 5. 构建最终 DataFrame(先不含总计行)final_df = pd.DataFrame(data_matrix, columns=flat_columns)final_df.insert(0, "region", row_index)# 6. 计算总计行(基于原始数据)total_dict = {"region": "合计"}categories = df["category"].unique()for cat in categories: # 销售额总和 total_dict[f"order_amount_sum_{cat}"] = df[df["category"]==cat]["order_amount"].sum() # 平均单价 total_dict[f"order_amount_mean_{cat}"] = df[df["category"]==cat]["order_amount"].mean() # 独立用户数 total_dict[f"user_id_nunique_{cat}"] = df[df["category"]==cat]["user_id"].nunique()# 全部总计(跨品类)total_dict["order_amount_sum_合计"] = df["order_amount"].sum()total_dict["order_amount_mean_合计"] = df["order_amount"].mean()total_dict["user_id_nunique_合计"] = df["user_id"].nunique()# 将总计行追加到 final_dftotal_series = pd.Series(total_dict)final_df = pd.concat([final_df, pd.DataFrame([total_series])], ignore_index=True)# 查看结果print("==== 多维交叉透视报表 ====")print(final_df)




总结
透视表天然适配二维交叉分析,一行代码实现多指标并行统计,自带总计行简化报表制作;搭配margins、fill_value参数可直接输出标准化看板,大幅减少多层groupby拼接代码量。