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

如何用Pandas按id列横向分组生成目标格式透视表

问题:Pandas DataFrame按id横向分组并调整列层级结构

原始数据

import pandas as pd

data = [['01/01/2000', 'aaa', 101, 102],
        ['01/02/2000', 'aaa', 201, 202],
        ['01/01/2000', 'bbb', 301, 302],
        ['01/02/2000', 'bbb', 401, 402],]

df = pd.DataFrame(data, columns=['date', 'id', 'val1', 'val2'])

原始DataFrame结构:

dateidval1val2
01/01/2000aaa101102
01/02/2000aaa201202
01/01/2000bbb301302
01/02/2000bbb401402

目标格式

希望转换为按id横向分组,每个id下包含val1和val2:

aaa             bbb
date        val1    val2    val1    val2    
01/01/2000  101     102     301     302     
01/02/2000  201     202     401     402

尝试的方法及问题

执行df.set_index(['date', 'id']).unstack(level=1)后,列层级顺序不符合预期:

val1      val2    
id    aaa  bbb  aaa  bbb
date                    
01/01/2000  101  301  102  302
01/02/2000  201  401  202  402

解决方案

通过调整列索引的层级顺序并排序,即可实现目标格式:

# 执行unstack操作
result = df.set_index(['date', 'id']).unstack(level=1)
# 交换列索引的层级,将id移到外层,val移到内层
result = result.swaplevel(axis=1)
# 按外层id排序,确保同一id下的val1、val2连续排列
result = result.sort_index(axis=1)

print(result)

输出结果

aaa             bbb
date        val1    val2    val1    val2
01/01/2000  101     102     301     302
01/02/2000  201     202     401     402

关键步骤说明

  • swaplevel(axis=1):交换列索引的两个层级,将原本内层的id转为外层,外层的val转为内层
  • sort_index(axis=1):对列索引进行排序,保证同一id对应的val1和val2连续排列,避免交叉

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:34:52