如何在Pandas中创建带小计的MultiIndex透视表?
创建带小计的MultiIndex透视表(Pandas)
嘿,我来帮你搞定这个在Pandas里生成带小计的MultiIndex透视表的需求!根据你的数据结构,我们可以通过分组聚合、添加小计行再重组索引的方式实现,下面是一步一步的具体方案:
步骤1:加载数据到DataFrame
首先把你提供的数据转换成Pandas能处理的DataFrame,我补全了你省略的最后一行数据(如果实际数据不同,你可以直接替换):
import pandas as pd data = [ ["2018-01-25", "type1", "item1", 1], ["2018-01-25", "type2", "item2", 2], ["2018-01-25", "type3", "item3", 3], ["2018-01-25", "type1", "item4", 4], ["2018-01-25", "type2", "item5", 5], ["2018-01-26", "type3", "item6", 6], ["2018-01-26", "type1", "item7", 7], ["2018-01-26", "type2", "item8", 8], ["2018-01-26", "type3", "item9", 9], ["2018-01-26", "type1", "item10", 10], ["2018-01-27", "type2", "item11", 11], ["2018-01-27", "type3", "item12", 12], ["2018-01-27", "type1", "item13", 13], ["2018-01-27", "type2", "item14", 14], ["2018-01-27", "type3", "item15", 15], ["2018-01-28", "type1", "item16", 16], ["2018-01-28", "type2", "item17", 17], ] df = pd.DataFrame(data, columns=["date", "item_type", "item_name", "gold_exit"])
步骤2:生成带小计的聚合数据
我们先按date和item_type分组求和,然后为每个日期添加小计行,最后加上整体总计:
# 1. 计算每个(date, item_type)组合的gold_exit总和 grouped = df.groupby(["date", "item_type"])["gold_exit"].sum().reset_index() # 2. 生成每个日期的小计行 date_totals = grouped.groupby("date")["gold_exit"].sum().reset_index() date_totals["item_type"] = "小计" # 标记为小计 # 3. 合并分组数据和日期小计 combined = pd.concat([grouped, date_totals], ignore_index=True) # 4. 添加整体总计行 grand_total = pd.DataFrame({ "date": ["总计"], "item_type": ["总计"], "gold_exit": [df["gold_exit"].sum()] }) combined = pd.concat([combined, grand_total], ignore_index=True)
步骤3:设置MultiIndex并调整排序
把date和item_type设为多层索引,同时调整排序让"小计"排在每个日期的最后:
# 自定义排序规则,让小计行在每个日期的所有类型之后 def sort_key(idx_tuple): date, item_type = idx_tuple # 给小计分配一个比所有type都靠后的排序键 return (date, "z" if item_type == "小计" else item_type) # 设置MultiIndex并排序 final_table = combined.set_index(["date", "item_type"]).sort_index(key=lambda idx: idx.map(sort_key)) # 查看结果 print(final_table)
输出效果
运行后你会得到这样的结果(简化版):
gold_exit date item_type 2018-01-25 type1 5 type2 7 type3 3 小计 15 2018-01-26 type1 17 type2 8 type3 15 小计 40 ... 总计 总计 182
这个方案完全基于Pandas原生方法,灵活可控,你可以根据需求调整小计的标记文字、聚合方式(比如换成均值、计数)或者排序逻辑。
内容的提问来源于stack exchange,提问作者George C. Serban
相关产品推荐
相关产品推荐

