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

如何将普通pandas DataFrame转换为多级列索引DataFrame?

Pandas单级列转财务报表多级列索引实现方案

核心逻辑非常直接:由于你的列是按三类财务报表顺序连续排列的,只需要给每一列匹配对应的一级报表分类,再通过pd.MultiIndex重构列索引即可,不需要复杂的表变形操作。


场景1:已知三类报表各自对应的指标列数(最常用)

绝大多数情况下你提前知道利润表、资产负债表、现金流量表分别包含多少个指标列,直接按列顺序匹配一级分类即可,示例代码如下:

import pandas as pd

# 按你实际的列数量修改下面的数值:比如利润表有5个指标就*5,资产负债表有8个就*8
level1_columns = [
    *["INCOME STATEMENT (in mln.)"] * 2,   # 替换2为利润表实际指标列数
    *["BALANCE SHEET (in mln.)"] * 2,      # 替换2为资产负债表实际指标列数
    *["CASH FLOW STATEMENT (in mln.)"] * 2 # 替换2为现金流量表实际指标列数
]

# 重构为两级列索引,第一级是报表分类,第二级是原始指标名
df.columns = pd.MultiIndex.from_arrays(
    [level1_columns, df.columns],
    names=["Report Category", "Financial Metric"] # 可选,给两级索引命名方便后续筛选
)

举个匹配的原始数据例子:如果你的原始列顺序是["Revenue", "Net Income", "Total Assets", "Total Liabilities", "Operating Cash Flow", "CapEx"],对应每类2个指标,运行上面代码后得到的多级列结构完全符合你的要求。


场景2:原始列中包含报表分类名作为分隔列

如果你的原始单级列里,三个报表的分类名称本身是作为单独的占位列存在的,可以自动识别分类边界,不需要手动数列数:

# 定义三个一级报表分类
report_cats = [
    "INCOME STATEMENT (in mln.)",
    "BALANCE SHEET (in mln.)",
    "CASH FLOW STATEMENT (in mln.)"
]

# 遍历所有列,自动给每个指标匹配所属分类
level1_columns = []
current_cat = None
for col_name in df.columns:
    if col_name in report_cats:
        current_cat = col_name
    level1_columns.append(current_cat)

# 生成多级列索引
df.columns = pd.MultiIndex.from_arrays([level1_columns, df.columns])

# 不需要保留分类占位列的话,执行下面这行过滤即可
# df = df.loc[:, [col for col in df.columns if col[0] != col[1]]]

转换后使用说明

转换完成后可以直接按多级索引的常规逻辑取数:

  • 提取整张利润表数据:df["INCOME STATEMENT (in mln.)"]
  • 提取单个指标(比如净利润):df[("INCOME STATEMENT (in mln.)", "Net Income")]

注意:构造level1_columns时一定要保证列表长度和原始DataFrame的列数完全一致,否则会触发长度不匹配的报错。

内容的提问来源于stack exchange,提问作者stochastic learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:18:22