如何用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结构:
| date | id | val1 | val2 |
|---|---|---|---|
| 01/01/2000 | aaa | 101 | 102 |
| 01/02/2000 | aaa | 201 | 202 |
| 01/01/2000 | bbb | 301 | 302 |
| 01/02/2000 | bbb | 401 | 402 |
目标格式
希望转换为按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
相关产品推荐
相关产品推荐

