如何生成含列求和结果的同结构MultiIndex DataFrame
解决多级索引DataFrame按列求和并保留原结构的问题
最简单的解决方案:用Pandas内置方法一步实现
不需要手动循环字典,直接用sum()方法就能快速得到符合要求的结果,还能完美保留原表的多级列结构:
import pandas as pd import numpy as np # 示例多级索引DataFrame columns = pd.MultiIndex.from_tuples([ ('A', 'a1'), ('A', 'a2'), ('B', 'b1'), ('B', 'b2'), ('C', 'c1') ], names=['Top', 'Sub']) df = pd.DataFrame(np.random.randint(1, 10, (3, 5)), columns=columns) # 生成求和结果的单行DataFrame sum_df = df.sum().to_frame().T # 可选:给行索引命名 sum_df.index = ['Total']
运行后sum_df的列结构和原表完全一致,仅包含一行所有列的求和结果。
你的错误原因分析
你遇到的"numpy.float64' object has no attribute 'extend'"错误,是因为你试图对单个数值(求和结果是numpy浮点数类型)调用列表的extend()方法。比如你可能写了类似sum_dict[top_col].extend(sub_sum)的代码,但sub_sum是单个数值,不是列表,自然无法使用extend。
手动循环字典的修正方案
如果一定要用循环字典的方式实现,需要为每个顶级列对应的子列单独构建键值对,再转换成多级列DataFrame:
sum_dict = {} # 按顶级列分组遍历 for top_col, sub_cols in df.columns.groupby(level=0): # 计算当前顶级列下所有子列的求和值 sub_sum_dict = {sub: df[(top_col, sub)].sum() for sub in sub_cols.get_level_values(1)} sum_dict[top_col] = sub_sum_dict # 从字典生成多级列DataFrame sum_df = pd.DataFrame.from_dict(sum_dict, orient='columns') sum_df.index = ['Total']
总结
优先使用Pandas内置的sum()方法,代码简洁且不易出错,完全能满足你保留两级表头、生成单行求和结果的需求。
内容的提问来源于stack exchange,提问作者user29839
相关产品推荐
相关产品推荐

