如何在Pandas多层索引多列DataFrame中按资产列块求和?
给多层列索引的Pandas DataFrame按顶层分组添加求和列
首先先构建你提供的示例DataFrame:
import pandas as pd # 构建多层列索引 columns = pd.MultiIndex.from_tuples([ ('Asset1', 'private'), ('Asset1', 'public'), ('Asset1', 'classified'), ('Asset2', 'private'), ('Asset2', 'public'), ('Asset2', 'classified') ]) # 填充数据 data = [ [2, 4, 5, 3, 4, 5], [6, 7, 8, 9, 10, 11] ] df = pd.DataFrame(data, index=['Bank1', 'Bank2'], columns=columns)
方法一:利用groupby批量计算并合并
通过groupby按顶层列索引分组求和,再将求和列合并回原DataFrame并排序:
# 计算每个Asset的列求和结果 sum_df = df.groupby(level=0, axis=1).sum() # 为求和结果设置多层列索引,匹配原格式 sum_df.columns = pd.MultiIndex.from_tuples([(col, 'total') for col in sum_df.columns]) # 合并原数据与求和列,按顶层索引排序让total列对应到各Asset下方 result = pd.concat([df, sum_df], axis=1).sort_index(axis=1, level=0)
方法二:循环遍历每个顶层列处理
如果需要更直观的分步操作,可以遍历每个Asset,单独计算求和并添加列:
result = df.copy() # 遍历所有唯一的顶层列(Asset1、Asset2) for asset in df.columns.get_level_values(0).unique(): # 计算当前Asset下所有子列的行求和 total_series = df[asset].sum(axis=1) # 添加新的多层索引列(asset, 'total') result[(asset, 'total')] = total_series # 按顶层索引排序,确保total列跟随对应Asset的其他列 result = result.sort_index(axis=1, level=0)
执行上述代码后,result的输出即为你期望的格式:
Asset1 Asset2 private public classified total private public classified total Bank1 2 4 5 11 3 4 5 12 Bank2 6 7 8 21 9 10 11 30
内容的提问来源于stack exchange,提问作者junfan02
相关产品推荐
相关产品推荐

