如何将普通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
相关产品推荐
相关产品推荐

