影刀RPA 数据分组汇总:分类统计与交叉报表 影刀RPA 数据分组汇总分类统计与交叉报表作者林焱什么情况用什么有一张明细数据表需要按各种维度汇总——按部门统计人数和平均工资、按地区×产品交叉统计销售额、按月份统计环比增长。在影刀RPA里用pandas的groupby和pivot_table可以快速生成各种汇总报表。适用场景月度/季度汇总报表、多维度交叉分析、分类统计、数据概览报表。怎么做基础分组统计拼多多店群自动化报活动上架importpandasaspd dfpd.read_excel(rC:\Data\sales_detail.xlsx)# 单列分组by_regiondf.groupby(地区).agg(订单数(订单ID,count),总金额(金额,sum),平均金额(金额,mean),最大金额(金额,max)).round(2).reset_index()# 多列分组by_region_productdf.groupby([地区,产品类别]).agg(订单数(订单ID,count),总金额(金额,sum)).reset_index()交叉报表# 地区(行) × 产品类别(列) 交叉统计金额crosspd.pivot_table(df,values金额,index地区,columns产品类别,aggfuncsum,fill_value0,marginsTrue,# 添加合计margins_name总计)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b94ee7d7c267446cbeb8ad56799980bf.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6a8734a419844de38b9d412237f13a7e.png#pic_center)# 多值交叉cross_multipd.pivot_table(df,values[金额,数量],index地区,columns产品类别,aggfunc{金额:sum,数量:sum},fill_value0)时间维度汇总# 按日期转换为时间格式df[日期]pd.to_datetime(df[日期])# 按月汇总df[月份]df[日期].dt.to_period(M)monthlydf.groupby(月份).agg(订单数(订单ID,count),总金额(金额,sum)).reset_index()# 按周汇总df[周]df[日期].dt.to_period(W)weeklydf.groupby(周).agg(总金额(金额,sum))# 按季度汇总df[季度]df[日期].dt.to_period(Q)quarterlydf.groupby(季度).agg(总金额(金额,sum))# 环比/同比增长monthly[环比增长]monthly[总金额].pct_change()多级分组汇总defgenerate_summary_report(df,output_path):生成多维度汇总报表withpd.ExcelWriter(output_path,engineopenpyxl)aswriter:# 1. 按地区汇总r1df.groupby(地区).agg(订单数(订单ID,count),总金额(金额,sum),平均金额(金额,mean),最大订单(金额,max),独立客户数(客户ID,nunique)).round(2).reset_index()r1.to_excel(writer,sheet_name按地区,indexFalse)# 2. 按产品汇总r2df.groupby(产品类别).agg(订单数(订单ID,count),总数量(数量,sum),总金额(金额,sum)).sort_values(总金额,ascendingFalse).reset_index()r2[金额占比](r2[总金额]/r2[总金额].sum()*100).round(2).astype(str)%r2.to_excel(writer,sheet_name按产品,indexFalse)# 3. 地区×产品交叉表r3pd.pivot_table(df,values金额,index地区,columns产品类别,aggfuncsum,fill_value0,marginsTrue,margins_name合计)r3.to_excel(writer,sheet_name交叉分析)# 4. 月度趋势df[月份]df[日期].dt.to_period(M).astype(str)r4df.groupby(月份).agg(订单数(订单ID,count),总金额(金额,sum)).reset_index()r4[环比增长](r4[总金额].pct_change()*100).round(2).astype(str)%r4.to_excel(writer,sheet_name月度趋势,indexFalse)# 5. TOP10客户r5df.groupby(客户名称).agg(订单数(订单ID,count),总金额(金额,sum)).nlargest(10,总金额).reset_index()r5.insert(0,排名,range(1,11))r5.to_excel(writer,sheet_nameTOP10客户,indexFalse)returnoutput_path# 使用generate_summary_report(df,rC:\Data\summary_report.xlsx)自定义聚合函数# 自定义聚合计算每个地区的金额中位数和标准差defcustom_agg(df):returnpd.Series({中位数:df[金额].median(),标准差:df[金额].std(),变异系数:df[金额].std()/df[金额].mean()ifdf[金额].mean()!0else0,偏度:df[金额].skew(),})resultdf.groupby(地区).apply(custom_agg).reset_index()分组后筛选# 只保留总金额超过10万的地区region_sumdf.groupby(地区)[金额].sum()big_regionsregion_sum[region_sum100000].index df_bigdf[df[地区].isin(big_regions)]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8e8d10b8273f4633a02bd88b05047dec.png#pic_center)# 或用transformdf[地区总额]df.groupby(地区)[金额].transform(sum)df_bigdf[df[地区总额]100000]有什么坑坑1分组后某些组缺失TEMU店群矩阵自动化运营核价报活动# 问题只有北京和上海有数据结果没有广州resultdf.groupby(地区)[金额].sum()# 解决用reindex补全![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cadb626289b540febf68519e0d83b7bc.png#pic_center)all_regions[北京,上海,广州,深圳]resultdf.groupby(地区)[金额].sum().reindex(all_regions,fill_value0)坑2pivot_table的合计行排序错乱# 问题marginsTrue的合计行不在最后pivotpd.pivot_table(df,values金额,index地区,columns产品,aggfuncsum,fill_value0,marginsTrue,margins_name合计)# 合计可能按拼音排在中间# 解决手动调整row_order[rforrinpivot.indexifr!合计][合计]pivotpivot.loc[row_order]col_order[cforcinpivot.columnsifc!合计][合计]pivotpivot[col_order]坑3多列agg列名混乱# 问题agg用字典方式产生多层列名resultdf.groupby(地区).agg({金额:[sum,mean],数量:count})# 列名是(金额, sum)这种格式# 解决用命名聚合![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/99ddc947851045c5b922034d2bce9309.png#pic_center)resultdf.groupby(地区).agg(总金额(金额,sum),平均金额(金额,mean),订单数(数量,count)).reset_index()坑4日期分组后Period类型无法写入Excel# 问题to_period(M)返回Period类型to_excel报错df[月份]df[日期].dt.to_period(M)# Period类型df.to_excel(output)# 可能报错# 解决转为字符串df[月份]df[日期].dt.to_period(M).astype(str)坑5分组统计后百分比计算错误# 问题想计算每个地区占总金额的百分比resultdf.groupby(地区)[金额].sum()# 直接除会报错或结果不对# 正确方式totaldf[金额].sum()resultdf.groupby(地区)[金额].sum()result_pct(result/total*100).round(2)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/db8e699267394a81993767110e5c1dc1.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/83312825945a4c8eac43c11d9a565ea4.png#pic_center)# 或在agg中计算resultdf.groupby(地区).agg(总金额(金额,sum))result[占比](result[总金额]/result[总金额].sum()*100).round(2)