Pandas的pivot_table适合把明细数据按行、列维度汇总。原文用日期、产品、区域、销售额、成本六行示例数据,演示多维度聚合、自定义聚合函数和列名处理。下面按可复现顺序整理,重点说明index、columns、values、aggfunc参数以及自定义函数的返回要求。
一、准备示例数据- import pandas as pd
- import numpy as np
- data = {
- '日期': pd.date_range('2023-01-01', periods=6),
- '产品': ['A', 'B', 'A', 'C', 'B', 'C'],
- '区域': ['东区', '西区', '东区', '西区', '东区', '西区'],
- '销售额': [120, 150, 90, 200, 180, 170],
- '成本': [80, 100, 60, 130, 110, 120]
- }
- df = pd.DataFrame(data)
复制代码
二、多维度聚合
在pd.pivot_table中,index控制行维度,columns控制列维度,values指定聚合字段,aggfunc可以是函数、函数列表或字段到函数的字典。原文示例将日期和产品叠加为行索引,区域作为列,销售额与成本同时聚合,其中销售额用np.sum和np.mean,成本只用np.sum。- pivot = pd.pivot_table(
- df,
- index=['日期', '产品'],
- columns='区域',
- values=['销售额', '成本'],
- aggfunc={'销售额': [np.sum, np.mean], '成本': np.sum}
- )
复制代码 输出为多层列结构:区域下分东区、西区,指标下分销售额、成本和sum/mean。缺少组合时显示为NaN或短横线。
三、多层列名处理
多指标多函数聚合后列名是元组,可用下划线拼接,方便后续读取和导出。- pivot.columns = ['_'.join(col) for col in pivot.columns]
复制代码
四、自定义聚合函数
aggfunc可传入自定义函数。原文案例1用profit_margin计算利润率,公式为(销售额-成本)/销售额。- def profit_margin(series):
- # 自定义利润率函数:(销售额-成本)/销售额
- return (series['销售额'] - series['成本']).sum() / series['销售额'].sum()
- result = pd.pivot_table(
- df,
- index='产品',
- values=['销售额', '成本'],
- aggfunc=profit_margin
- )
复制代码 这里要注意:自定义聚合函数必须返回标量;如果函数内部同时读取销售额和成本两列,需要确认实际传入对象包含这两列。pivot_table按列聚合时通常传入单列Series,直接写series['销售额']可能取不到另一列。原文示例展示的是同时访问两列的写法,落地时应检查传入结构,必要时在透视前构造利润列,或改用能按组访问多列的方式。
案例2:分位数分析。用lambda定义25%和75%分位数,与np.mean组合。- quantile_25 = lambda x: x.quantile(0.25)
- quantile_75 = lambda x: x.quantile(0.75)
- pivot_quantile = pd.pivot_table(
- df,
- index='区域',
- values='销售额',
- aggfunc=[np.mean, quantile_25, quantile_75]
- )
复制代码
五、常用高级参数
fill_value=0可填充缺失值;margins=True可生成总计行;同一字段多函数可用字典或列表组合。- pivot_more = pd.pivot_table(
- df,
- index=['日期', '产品'],
- columns='区域',
- values=['销售额', '成本'],
- aggfunc={'销售额': [np.sum, np.std], '成本': [np.mean, max]},
- fill_value=0,
- margins=True
- )
复制代码
六、层次索引与公式说明
多维度透视后index为层次索引,切片推荐使用.xs()方法。原文给出相关统计公式:均值计算为n个样本求和后除以n;利润率r=(S-C)/S,其中S为销售额、C为成本;分位数Qp满足P(X<=Qp)=p。这些公式对应aggfunc中的均值、利润率和分位数计算。
七、注意事项
1. 自定义聚合函数需返回标量值。
2. 多维度透视时注意层次索引的切片操作,推荐使用.xs()方法。
3. 对同一字段应用多个聚合函数后,列名常为多层结构,可用下划线拼接。
4. fill_value与margins按业务报表需求添加,前者处理缺失组合,后者生成总计行。 |