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

如何在Pandas中将多级索引DataFrame转换为行索引重复的单索引DataFrame?

解决Pandas宽表转长表(多级索引转单索引)的问题

这在Pandas里其实是很常见的宽表转长表操作,有两种简单直观的方法可以实现,我给你一步步演示:

1. 先构造示例数据

首先我们先还原你给出的两级索引DataFrame,方便后续测试:

import pandas as pd

data = {
    1: [2, 1, 0],
    2: [4, 3, 0],
    3: [6, 5, 0],
    4: [8, 7, 0],
    5: [10, 9, 0]
}
# 把Time设为行索引
df = pd.DataFrame(data, index=pd.Index([0, 1, 2], name='Time'))

2. 方法一:使用melt()(推荐,语义清晰)

melt()是Pandas专门为宽转长设计的方法,参数设置非常直观:

# 先把行索引Time转为普通列,再执行melt转换
long_df = df.reset_index().melt(
    id_vars='Time',        # 指定保留作为标识的列(每个Time会重复对应所有Location)
    var_name='Location',   # 原列名(Location编号)对应的新列名称
    value_name='Value'     # 原单元格数值对应的新列名称
)

3. 方法二:使用stack()(适合熟悉索引操作的场景)

stack()会把列索引转为行索引的一部分,形成多级索引,再重置索引即可:

# stack将列转为内层行索引,得到多级索引Series,再重置索引为列
long_df = df.stack().reset_index()
# 重命名列名匹配需求
long_df.columns = ['Time', 'Location', 'Value']

最终转换结果

两种方法都会得到你需要的单索引DataFrame:

Time  Location  Value
0     0         1      2
1     0         2      4
2     0         3      6
3     0         4      8
4     0         5     10
5     1         1      1
6     1         2      3
7     1         3      5
8     1         4      7
9     1         5      9
10    2         1      0
11    2         2      0
12    2         3      0
13    2         4      0
14    2         5      0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:11:25