影刀RPA 数据分组汇总:分类统计与交叉报表

影刀RPA 数据分组汇总:分类统计与交叉报表

影刀RPA 数据分组汇总:分类统计与交叉报表

作者:林焱

什么情况用什么

有一张明细数据表,需要按各种维度汇总——按部门统计人数和平均工资、按地区×产品交叉统计销售额、按月份统计环比增长。在影刀RPA里用pandas的groupby和pivot_table可以快速生成各种汇总报表。

适用场景:月度/季度汇总报表、多维度交叉分析、分类统计、数据概览报表。

怎么做

基础分组统计

拼多多店群自动化报活动上架!

importpandasaspd df=pd.read_excel(r"C:\Data\sales_detail.xlsx")# 单列分组by_region=df.groupby('地区').agg(订单数=('订单ID','count'),总金额=('金额','sum'),平均金额=('金额','mean'),最大金额=('金额','max')).round(2).reset_index()# 多列分组by_region_product=df.groupby(['地区','产品类别']).agg(订单数=('订单ID','count'),总金额=('金额','sum')).reset_index()

交叉报表

# 地区(行) × 产品类别(列) 交叉统计金额cross=pd.pivot_table(df,values='金额',index='地区',columns='产品类别',aggfunc='sum',fill_value=0,margins=True,# 添加合计margins_name='总计')![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b94ee7d7c267446cbeb8ad56799980bf.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6a8734a419844de38b9d412237f13a7e.png#pic_center)# 多值交叉cross_multi=pd.pivot_table(df,values=['金额','数量'],index='地区',columns='产品类别',aggfunc={'金额':'sum','数量':'sum'},fill_value=0)

时间维度汇总

# 按日期转换为时间格式df['日期']=pd.to_datetime(df['日期'])# 按月汇总df['月份']=df['日期'].dt.to_period('M')monthly=df.groupby('月份').agg(订单数=('订单ID','count'),总金额=('金额','sum')).reset_index()# 按周汇总df['周']=df['日期'].dt.to_period('W')weekly=df.groupby('周').agg(总金额=('金额','sum'))# 按季度汇总df['季度']=df['日期'].dt.to_period('Q')quarterly=df.groupby('季度').agg(总金额=('金额','sum'))# 环比/同比增长monthly['环比增长']=monthly['总金额'].pct_change()

多级分组汇总

defgenerate_summary_report(df,output_path):"""生成多维度汇总报表"""withpd.ExcelWriter(output_path,engine='openpyxl')aswriter:# 1. 按地区汇总r1=df.groupby('地区').agg(订单数=('订单ID','count'),总金额=('金额','sum'),平均金额=('金额','mean'),最大订单=('金额','max'),独立客户数=('客户ID','nunique')).round(2).reset_index()r1.to_excel(writer,sheet_name='按地区',index=False)# 2. 按产品汇总r2=df.groupby('产品类别').agg(订单数=('订单ID','count'),总数量=('数量','sum'),总金额=('金额','sum')).sort_values('总金额',ascending=False).reset_index()r2['金额占比']=(r2['总金额']/r2['总金额'].sum()*100).round(2).astype(str)+'%'r2.to_excel(writer,sheet_name='按产品',index=False)# 3. 地区×产品交叉表r3=pd.pivot_table(df,values='金额',index='地区',columns='产品类别',aggfunc='sum',fill_value=0,margins=True,margins_name='合计')r3.to_excel(writer,sheet_name='交叉分析')# 4. 月度趋势df['月份']=df['日期'].dt.to_period('M').astype(str)r4=df.groupby('月份').agg(订单数=('订单ID','count'),总金额=('金额','sum')).reset_index()r4['环比增长']=(r4['总金额'].pct_change()*100).round(2).astype(str)+'%'r4.to_excel(writer,sheet_name='月度趋势',index=False)# 5. TOP10客户r5=df.groupby('客户名称').agg(订单数=('订单ID','count'),总金额=('金额','sum')).nlargest(10,'总金额').reset_index()r5.insert(0,'排名',range(1,11))r5.to_excel(writer,sheet_name='TOP10客户',index=False)returnoutput_path# 使用generate_summary_report(df,r"C:\Data\summary_report.xlsx")

自定义聚合函数

# 自定义聚合:计算每个地区的金额中位数和标准差defcustom_agg(df):returnpd.Series({'中位数':df['金额'].median(),'标准差':df['金额'].std(),'变异系数':df['金额'].std()/df['金额'].mean()ifdf['金额'].mean()!=0else0,'偏度':df['金额'].skew(),})result=df.groupby('地区').apply(custom_agg).reset_index()

分组后筛选

# 只保留总金额超过10万的地区region_sum=df.groupby('地区')['金额'].sum()big_regions=region_sum[region_sum>100000].index df_big=df[df['地区'].isin(big_regions)]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8e8d10b8273f4633a02bd88b05047dec.png#pic_center)# 或用transformdf['地区总额']=df.groupby('地区')['金额'].transform('sum')df_big=df[df['地区总额']>100000]

有什么坑

坑1:分组后某些组缺失

TEMU店群矩阵自动化运营核价报活动

# 问题:只有北京和上海有数据,结果没有广州result=df.groupby('地区')['金额'].sum()# 解决:用reindex补全![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cadb626289b540febf68519e0d83b7bc.png#pic_center)all_regions=['北京','上海','广州','深圳']result=df.groupby('地区')['金额'].sum().reindex(all_regions,fill_value=0)

坑2:pivot_table的合计行排序错乱

# 问题:margins=True的"合计"行不在最后pivot=pd.pivot_table(df,values='金额',index='地区',columns='产品',aggfunc='sum',fill_value=0,margins=True,margins_name='合计')# 合计可能按拼音排在中间# 解决:手动调整row_order=[rforrinpivot.indexifr!='合计']+['合计']pivot=pivot.loc[row_order]col_order=[cforcinpivot.columnsifc!='合计']+['合计']pivot=pivot[col_order]

坑3:多列agg列名混乱

# 问题:agg用字典方式产生多层列名result=df.groupby('地区').agg({'金额':['sum','mean'],'数量':'count'})# 列名是('金额', 'sum')这种格式# 解决:用命名聚合![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/99ddc947851045c5b922034d2bce9309.png#pic_center)result=df.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:分组统计后百分比计算错误

# 问题:想计算每个地区占总金额的百分比result=df.groupby('地区')['金额'].sum()# 直接除会报错或结果不对# 正确方式total=df['金额'].sum()result=df.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中计算result=df.groupby('地区').agg(总金额=('金额','sum'))result['占比']=(result['总金额']/result['总金额'].sum()*100).round(2)