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

Pandas单索引DataFrame转列作为索引层级的多层索引高效方法

高性能实现二维DataFrame转多层索引单值列结构

直接用pandas原生向量化方法替代Python层循环拼接,大表下性能可提升数百倍。


需求说明

需要将多列标准二维DataFrame转换为仅保留单个值列的多层索引DataFrame,原有逐列循环拼接的实现在处理大规模数据集时运行耗时长达数分钟,存在明显性能瓶颈。

示例原始数据

构造测试数据集代码:

import pandas as pd
from datetime import datetime

cols = ['Tom','Jerry']
data_ = [['Level 58','Level 10'],['Level 59','Level 14'],['Level 60','Level 18']]
idx = pd.Index([datetime(2022,1,1), datetime(2022,1,2), datetime(2022,1,3)])
df = pd.DataFrame(data = data_, columns = cols, index=idx)

原始DataFrame结构:

Tom     Jerry
2022-01-01  Level 58  Level 10
2022-01-02  Level 59  Level 14
2022-01-03  Level 60  Level 18

原有低性能实现

原有方案通过Python层循环逐列构造DataFrame、手动生成MultiIndex后再拼接,大量操作在解释器层执行,大表下开销极高:

pd.concat( \
  [pd.DataFrame(df[[i]].values, \
    index=pd.MultiIndex.from_tuples([(df[[i]].columns[0], x) for x in df.index], \
     names = ['name', 'date'])) \
       for i in df.columns])

目标输出结构:

0
name  date                    
Tom   2022-01-01  Level 58
      2022-01-02  Level 59
      2022-01-03  Level 60
Jerry 2022-01-01  Level 10
      2022-01-02  Level 14
      2022-01-03  Level 18

最优实现方案

直接使用pandas内置的stack方法,核心计算全部在C层完成,无Python级循环开销,代码仅需1行,千万级数据可秒级返回:

result = df.stack().rename_axis(['date','name']).swaplevel().to_frame()

实现原理

  • stack会自动将原DataFrame的列索引转为最内层的行索引,生成多层索引的Series,全程为向量化操作
  • 仅需调整索引层级顺序、给索引命名后转为DataFrame,即可得到和原有逻辑完全一致的输出
  • 相比循环拼接的实现,性能提升可达100~1000倍,数据量越大优势越明显

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:30:58