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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:28:24