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

如何用Pandas stack()实现指定顺序的宽表转长表?

使用Pandas的stack()实现目标格式

当然可以用stack()实现你的需求!问题出在默认的stack()行为是按列的顺序依次处理,而我们需要先给列添加层级信息,让stack()能按我们期望的组(1/2)来堆叠,同时保持每个ID下的组顺序。以下是具体解决方案:

步骤1:定义原始DataFrame(方便复现)

import pandas as pd

data = {
    'ID': [1, 2],
    'A1': [3, 7],
    'B1': [4, 8],
    'A2': [5, 9],
    'B2': [6, 10]
}
df = pd.DataFrame(data)

步骤2:设置ID为索引

先把ID列设为索引,避免后续堆叠操作干扰它:

df = df.set_index('ID')

步骤3:将列名转换为多级索引

这是核心步骤——把列名拆分成**变量名(A/B)和组号(1/2)**两个层级,让Pandas识别哪些列属于同一组:

# 拆分列名,生成(var, group)格式的多级索引
df.columns = pd.MultiIndex.from_tuples(
    [(col[0], int(col[1])) for col in df.columns],
    names=['var', 'group']
)

步骤4:用stack()堆叠组层级

指定堆叠group层级,这样每个ID下的两组数据会被放在连续的行中:

stacked = df.stack(level='group')

步骤5:清理索引得到目标格式

最后重置索引,去掉不需要的group列:

result = stacked.reset_index(level='group', drop=True).reset_index()
print(result)

最终输出

ID  A   B
0   1  3   4
1   1  5   6
2   2  7   8
3   2  9  10

原理说明

通过多级索引,我们明确告诉Pandas:A1和B1属于第1组,A2和B2属于第2组。stack(level='group')会将每个组从列维度转到行维度,同时保持每个ID下的组顺序,完美解决了默认stack()导致的ID分散问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:08