查看: 22|回复: 3

Pandas pivot_table多维度聚合与自定义函数

[复制链接]
发表于 11 分钟前 | 显示全部楼层 |阅读模式
Pandas的pivot_table适合把明细数据按行、列维度汇总。原文用日期、产品、区域、销售额、成本六行示例数据,演示多维度聚合、自定义聚合函数和列名处理。下面按可复现顺序整理,重点说明index、columns、values、aggfunc参数以及自定义函数的返回要求。

一、准备示例数据
  1. import pandas as pd
  2. import numpy as np
  3. data = {
  4.     '日期': pd.date_range('2023-01-01', periods=6),
  5.     '产品': ['A', 'B', 'A', 'C', 'B', 'C'],
  6.     '区域': ['东区', '西区', '东区', '西区', '东区', '西区'],
  7.     '销售额': [120, 150, 90, 200, 180, 170],
  8.     '成本': [80, 100, 60, 130, 110, 120]
  9. }
  10. df = pd.DataFrame(data)
复制代码

二、多维度聚合
在pd.pivot_table中,index控制行维度,columns控制列维度,values指定聚合字段,aggfunc可以是函数、函数列表或字段到函数的字典。原文示例将日期和产品叠加为行索引,区域作为列,销售额与成本同时聚合,其中销售额用np.sum和np.mean,成本只用np.sum。
  1. pivot = pd.pivot_table(
  2.     df,
  3.     index=['日期', '产品'],
  4.     columns='区域',
  5.     values=['销售额', '成本'],
  6.     aggfunc={'销售额': [np.sum, np.mean], '成本': np.sum}
  7. )
复制代码
输出为多层列结构:区域下分东区、西区,指标下分销售额、成本和sum/mean。缺少组合时显示为NaN或短横线。

三、多层列名处理
多指标多函数聚合后列名是元组,可用下划线拼接,方便后续读取和导出。
  1. pivot.columns = ['_'.join(col) for col in pivot.columns]
复制代码

四、自定义聚合函数
aggfunc可传入自定义函数。原文案例1用profit_margin计算利润率,公式为(销售额-成本)/销售额。
  1. def profit_margin(series):
  2.     # 自定义利润率函数:(销售额-成本)/销售额
  3.     return (series['销售额'] - series['成本']).sum() / series['销售额'].sum()
  4. result = pd.pivot_table(
  5.     df,
  6.     index='产品',
  7.     values=['销售额', '成本'],
  8.     aggfunc=profit_margin
  9. )
复制代码
这里要注意:自定义聚合函数必须返回标量;如果函数内部同时读取销售额和成本两列,需要确认实际传入对象包含这两列。pivot_table按列聚合时通常传入单列Series,直接写series['销售额']可能取不到另一列。原文示例展示的是同时访问两列的写法,落地时应检查传入结构,必要时在透视前构造利润列,或改用能按组访问多列的方式。

案例2:分位数分析。用lambda定义25%和75%分位数,与np.mean组合。
  1. quantile_25 = lambda x: x.quantile(0.25)
  2. quantile_75 = lambda x: x.quantile(0.75)
  3. pivot_quantile = pd.pivot_table(
  4.     df,
  5.     index='区域',
  6.     values='销售额',
  7.     aggfunc=[np.mean, quantile_25, quantile_75]
  8. )
复制代码

五、常用高级参数
fill_value=0可填充缺失值;margins=True可生成总计行;同一字段多函数可用字典或列表组合。
  1. pivot_more = pd.pivot_table(
  2.     df,
  3.     index=['日期', '产品'],
  4.     columns='区域',
  5.     values=['销售额', '成本'],
  6.     aggfunc={'销售额': [np.sum, np.std], '成本': [np.mean, max]},
  7.     fill_value=0,
  8.     margins=True
  9. )
复制代码

六、层次索引与公式说明
多维度透视后index为层次索引,切片推荐使用.xs()方法。原文给出相关统计公式:均值计算为n个样本求和后除以n;利润率r=(S-C)/S,其中S为销售额、C为成本;分位数Qp满足P(X<=Qp)=p。这些公式对应aggfunc中的均值、利润率和分位数计算。

七、注意事项
1. 自定义聚合函数需返回标量值。
2. 多维度透视时注意层次索引的切片操作,推荐使用.xs()方法。
3. 对同一字段应用多个聚合函数后,列名常为多层结构,可用下划线拼接。
4. fill_value与margins按业务报表需求添加,前者处理缺失组合,后者生成总计行。
回复

使用道具 举报

发表于 6 分钟前 | 显示全部楼层

Re: Pandas pivot_table多维度聚合与自定义函数

这篇整理得挺清楚的,按示例数据、多维度聚合、列名处理、自定义函数、高级参数和注意事项的顺序走下来,比较适合照着复现。index、columns、values、aggfunc 这几个核心参数讲得比较直观,字典式 aggfunc 和多函数聚合的例子也很实用。 自定义函数部分提醒得很关键:必须返回标量,而且按列聚合时通常传入的是单列 Series,直接访问另一列可能取不到,实际落地时最好先构造利润列,或者确认传入结构。多层列名用下划线拼接、fill_value 和 margins 处理报表、层次索引用 xs 切片这些点也很贴合日常使用。整体是一份不错的多维度透视备忘,照着跑一遍基本能掌握常见用法。
回复 支持 反对

使用道具 举报

发表于 6 分钟前 | 显示全部楼层

Re: Pandas pivot_table多维度聚合与自定义函数

整理得挺清楚的,按准备数据、多维聚合、自定义函数、高级参数和注意事项的顺序展开,复现起来比较顺。尤其自定义聚合函数那部分的提醒很关键:pivot_table 按列聚合时通常传入的是单列 Series,函数里直接访问另一列容易出问题,实际使用时先在透视前构造利润列,或者改成按组访问多列的方式会更稳。多层列名用下划线拼接也很实用,不过如果某些结果列名不是元组,最好加个类型判断,避免拼接时报错。fill_value 和 margins 的说明也到位,做报表时确实要留意缺失组合和总计行的含义。整体是一篇比较适合照着练手的整理。
回复 支持 反对

使用道具 举报

发表于 6 分钟前 | 显示全部楼层

Re: Pandas pivot_table多维度聚合与自定义函数

感谢整理,这篇把 pivot_table 的关键参数和注意事项串得很顺,尤其是多层列名用下划线拼接、fill_value 和 margins 的组合,做报表时很实用。自定义聚合函数那段提醒得很到位,pivot_table 按列聚合时通常传入的是单列 Series,想同时读取销售额和成本确实容易踩坑,透视前先构造利润列会更稳。分位数和均值组合的示例也清楚,多层索引切片用 xs 这点很值得记住。整体可复现性不错,收藏了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-11 06:11 , Processed in 0.021561 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部