Pandas中MultiIndex转置及多月度账单DataFrame合并展示问题
Pandas多级索引转换与多月度DataFrame合并方案
刚接触Pandas确实容易在多级索引的操作上卡壳,我来一步步帮你解决这个问题:
第一步:处理单个月度DataFrame(以三月为例)
首先先回顾你创建三月数据的代码:
import numpy as np import pandas as pd # 创建三月原始DataFrame march = np.arange(27).reshape(3, 9) march = pd.DataFrame(data=march, index=['A', 'B', 'C'], columns=['mar' + chr(ord('A') + i) for i in range(9)])
你已经给它加上了多级列索引,但想要转置成目标样式,需要调整索引层级并重新组织结构:
# 设置多级列索引 dates = ['March'] cols = pd.MultiIndex.from_product([dates, march.columns.to_list()]) march_multi = pd.DataFrame(march, columns=cols) # 转置并拆分索引为列 march_transposed = march_multi.T.reset_index() # 给列重命名,方便后续处理 march_transposed.columns = ['Month', 'Column', 'A', 'B', 'C'] # 把列名里的"mar"替换成你想要的"col" march_transposed['Column'] = march_transposed['Column'].str.replace('mar', 'col') # 用pivot重新组织成目标结构 final_march = march_transposed.pivot(index='Column', columns='Month', values=['A', 'B', 'C']) # 调整列的层级顺序,把月份放到上层 final_march = final_march.swaplevel(axis=1).sort_index(axis=1)
这样就能得到你想要的转置后样式了。
第二步:批量处理多个月度DataFrame并合并
为了高效处理多个月份的数据,我们可以把单个月份的处理逻辑封装成函数,然后批量处理再合并:
1. 示例:创建另一个月度数据(一月)
# 创建一月示例数据 january = np.arange(27, 54).reshape(3, 9) january = pd.DataFrame(data=january, index=['A', 'B', 'C'], columns=['jan' + chr(ord('A') + i) for i in range(9)])
2. 定义处理函数
def process_monthly_df(df, month_name): """处理单个月度DataFrame,返回格式化后的临时数据""" # 设置多级列索引 cols = pd.MultiIndex.from_product([[month_name], df.columns.to_list()]) df_multi = pd.DataFrame(df, columns=cols) # 转置并拆分索引 df_transposed = df_multi.T.reset_index() df_transposed.columns = ['Month', 'Column', 'A', 'B', 'C'] # 替换列名前缀(比如jan→col) df_transposed['Column'] = df_transposed['Column'].str.replace(month_name[:3].lower(), 'col') return df_transposed
3. 批量处理并合并
# 处理一月和三月数据 jan_processed = process_monthly_df(january, 'January') march_processed = process_monthly_df(march, 'March') # 合并所有处理后的月度数据 combined_data = pd.concat([jan_processed, march_processed], ignore_index=True) # 生成最终的合并表格 final_combined = combined_data.pivot(index='Column', columns='Month', values=['A', 'B', 'C']) final_combined = final_combined.swaplevel(axis=1).sort_index(axis=1)
运行后就能得到你想要的最终格式:行是colA、colB等,列是月份(January、March),每个月份下包含A、B、C三个子列。
为什么之前stack/unstack没生效?
你之前尝试的stack/unstack是调整索引层级的常用方法,但这里因为初始的多级列是[月份, 原始列名],转置后索引变成[月份, 原始列名],直接stack/unstack会打乱层级关系。我们需要先把索引拆成普通列,再用pivot重新组织层级,才能得到目标结构。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

