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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:14:03