如何用Pandas DataFrame生成带分级小计的财务汇总表?
Pandas 实现带业务级小计、类型级总计的汇总表
针对你的需求,完全不需要用循环+df.loc的方式,Pandas的分组聚合(groupby)+ 合并(concat)就能高效实现,以下是具体步骤:
1. 模拟测试数据
先构造和你的DataFrame结构一致的测试数据,方便验证效果:
import pandas as pd # 模拟业务数据 data = { 'Business': ['电商', '电商', '零售', '零售', '电商', '零售'], 'Business Type': ['平台', '商家', '线下门店', '线上商城', '平台', '线下门店'], 'ID': ['A001', 'A002', 'B001', 'B002', 'A003', 'B003'], 'Value-Q1': [100, 200, 150, 300, 180, 220], 'Value-Q2': [120, 210, 160, 320, 190, 230], 'Value-FY': [450, 850, 600, 1200, 700, 800] } df = pd.DataFrame(data)
2. 定义聚合规则
先明确需要统计的内容:
ID列统计出现次数(用count)- 所有
Value-*列求和(用sum)
# 定义聚合规则,键是列名,值是聚合方法 agg_rules = { 'ID': 'count', 'Value-Q1': 'sum', 'Value-Q2': 'sum', 'Value-FY': 'sum' }
3. 生成基础分组汇总
按Business和Business Type分组,得到各业务类型的基础统计结果:
# 分组聚合,保留列索引 grouped = df.groupby(['Business', 'Business Type'], as_index=False).agg(agg_rules) # 把ID列重命名为更直观的Count grouped.rename(columns={'ID': 'Count'}, inplace=True)
4. 添加业务级小计
生成每个Business的小计行,再和基础汇总合并:
# 按Business分组生成小计 subtotals = df.groupby('Business', as_index=False).agg(agg_rules) subtotals['Business Type'] = '小计' subtotals.rename(columns={'ID': 'Count'}, inplace=True) # 合并基础汇总和小计,排序让小计行排在对应业务的最后 combined = pd.concat([grouped, subtotals], ignore_index=True) # 用临时排序键确保小计行在末尾 combined['sort_key'] = combined['Business Type'].apply(lambda x: 1 if x == '小计' else 0) combined.sort_values(by=['Business', 'sort_key'], inplace=True) combined.drop(columns='sort_key', inplace=True)
5. 添加全局总计
生成整个数据集的总计行,合并到最终结果:
# 生成总计行,转置为DataFrame格式 grand_total = df.agg(agg_rules).to_frame().T grand_total['Business'] = '总计' grand_total['Business Type'] = '' grand_total.rename(columns={'ID': 'Count'}, inplace=True) # 合并得到最终汇总表 final_df = pd.concat([combined, grand_total], ignore_index=True) final_df.reset_index(drop=True, inplace=True)
最终效果
执行后final_df的输出如下:
Business Business Type Count Value-Q1 Value-Q2 Value-FY 0 电商 平台 2 280 310 1150 1 电商 商家 1 200 210 850 2 电商 小计 3 480 520 2000 3 零售 线下门店 2 370 390 1400 4 零售 线上商城 1 300 320 1200 5 零售 小计 3 670 710 2600 6 总计 6 1150 1230 4600
方法优势
- 完全避免循环,利用Pandas内置的向量运算能力,处理大数据量时效率远高于循环
- 代码可扩展性强:后续扩展月份对比工具时,只需调整
agg_rules中的列名或聚合方法即可适配 - 逻辑清晰,易于维护和修改
内容的提问来源于stack exchange,提问作者user20412841
相关产品推荐
相关产品推荐

