如何在保留多级索引的前提下向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
相关产品推荐
相关产品推荐

