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

