Pandas中如何交换列轴层级?解决unstack后的列结构问题
解决Pandas列层级交换问题
嘿,这个需求很好实现!你只需要在unstack()之后,用swaplevel()交换列的层级顺序,再用sort_index()整理列的排列即可。下面是具体步骤和代码示例:
1. 先构造你的原始DataFrame
import pandas as pd df = pd.DataFrame({ 'id': [36, 36, 36, 97, 97, 97], 'cat': ['A', 'B', 'C', 'A', 'B', 'C'], 'v1': [1, 3, 5, 7, 9, 11], 'v2': [2, 4, 6, 8, 10, 12] })
2. 执行你的初始操作 + 层级交换
你原来的set_index + unstack会得到层级颠倒的列,我们在此基础上添加两步:
# 先完成你原来的操作 unstacked_df = df.set_index(['id', 'cat']).unstack() # 交换列的两个层级(axis=1表示针对列索引操作) swapped_df = unstacked_df.swaplevel(axis=1) # 按列索引排序,确保每个分组下的v1、v2有序排列 final_df = swapped_df.sort_index(axis=1)
或者可以把这几步合并成一行更简洁的代码:
final_df = df.set_index(['id', 'cat']).unstack().swaplevel(axis=1).sort_index(axis=1)
3. 最终结果
打印final_df会得到你期望的结构:
A B C v1 v2 v1 v2 v1 v2 id 36 1 2 3 4 5 6 97 7 8 9 10 11 12
原理说明
swaplevel(axis=1):交换列索引的两个层级,把原本在第二层的cat(A/B/C)移到第一层,原本在第一层的v1/v2移到第二层。sort_index(axis=1):对列索引进行排序,让相同顶层索引(A/B/C)的列聚集在一起,同时保证每个分组内的v1在v2前面,让结构更规整。
内容的提问来源于stack exchange,提问作者JairoV
相关产品推荐
相关产品推荐

