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

如何在保留多级索引的前提下向Pandas DataFrame插入小计行

解决Pandas多级索引DataFrame插入分组小计行的问题

核心思路

先拆分原DataFrame的非总计行与总计行,将分组小计数据(df2)与非总计行合并,通过自定义排序确保小计行落在对应作物数据的下方,最后追加回总计行,全程保留多级索引结构。

步骤与代码实现

1. 构造模拟数据(可替换为你的真实数据)

import pandas as pd

# 构造包含总计行的df1
index_df1 = pd.MultiIndex.from_tuples(
    [
        ('地块A', '子地块A1', '小麦', '2023-01-01'),
        ('地块A', '子地块A1', '小麦', '2023-01-02'),
        ('地块A', '子地块A2', '玉米', '2023-01-01'),
        ('地块A', '子地块A2', '玉米', '2023-01-02'),
        ('总计', '', '', '')
    ],
    names=['地块', '子地块', '作物', '日期']
)
df1 = pd.DataFrame({'数量': [10, 20, 15, 25, 70]}, index=index_df1)

# 构造作物分组小计的df2(模拟你的现有df2)
df_no_total = df1[df1.index.get_level_values('地块') != '总计']
df2 = df_no_total.groupby(level=['地块', '子地块', '作物']).sum()
# 给df2补充日期层级为'Subtotal',对齐df1的索引结构
df2 = df2.set_index(pd.Index(['Subtotal']*len(df2), name='日期'), append=True)

2. 拆分原DataFrame

# 分离df1中的非总计行和总计行
df1_non_total = df1[df1.index.get_level_values('地块') != '总计']
df1_total_row = df1[df1.index.get_level_values('地块') == '总计']

3. 合并并排序数据

# 合并非总计行与小计行
combined_data = pd.concat([df1_non_total, df2])

# 自定义排序规则:前三级索引保持原分组,日期为'Subtotal'的行排在对应分组最后
def index_sort_key(idx):
    # 前三级索引作为排序基准,日期字段如果是Subtotal则用一个靠后的标识(比如'Z')来确保排在最后
    return idx[:3] + (('Z',) if idx[3] == 'Subtotal' else (idx[3],))

# 按自定义规则重新排序索引
sorted_index = sorted(combined_data.index, key=index_sort_key)
sorted_data = combined_data.loc[sorted_index]

4. 追加总计行得到最终结果

final_df = pd.concat([sorted_data, df1_total_row])

验证结果

执行print(final_df)会得到如下结构的DataFrame:

数量
地块   子地块  作物 日期       
地块A 子地块A1 小麦 2023-01-01    10
             2023-01-02    20
             Subtotal       30
     子地块A2 玉米 2023-01-01    15
             2023-01-02    25
             Subtotal       40
总计           70

内容的提问来源于stack exchange,提问作者Judy T Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:09:28