You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:53