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

Pandas将表格数据透视为指定多级行列索引矩阵并自定义排序

Pandas指定多级索引顺序透视实现方案

基础数据与规则定义

首先构造原始测试数据与指定排序规则,代码如下:

import pandas as pd
from pandas.api.types import CategoricalDtype

# 构造原始DataFrame
values = list(range(5))
var1 = ['01', '02', '03', '0', '0']
var2 = ['a', 'b', 'c', 'd', 'e']
var3 = ['01', '02', '03', '0', '0']
var4 = ['a', 'b', 'c', 'd', 'e']
var5 = ['S1', 'S1','S1', 'S3', 'S2']
var6 = ['P1', 'P1','P1', 'P3', 'P2']

df = pd.DataFrame({
    'var1': var1,
    'var2': var2,
    'var3': var3,
    'var4': var4,
    'var5': var5,
    'var6': var6,
    'value': values
})

# 给定的强制排序规则
var5_order = ['S1', 'S2', 'S3', 'S4']
var6_order = ['P1', 'P2', 'P3', 'P4']

核心需求:

  • 透视后行多级索引按顺序为var6、var1、var2
  • 透视后列多级索引按顺序为var5、var3、var4
  • 索引中var5、var6层级必须严格遵循给定排序,不使用默认的字典序或值出现顺序

实现步骤

1. 生成基础透视表

直接调用pivot方法,严格按照要求的层级顺序传入行、列索引字段,值字段取value:

pivot_df = df.pivot(
    index=['var6', 'var1', 'var2'],
    columns=['var5', 'var3', 'var4'],
    values='value'
)

这一步生成的透视表默认按值的出现顺序排列索引,不会自动应用自定义排序规则,需要后续处理。

2. 应用强制排序规则

通过有序分类类型(CategoricalDtype)给对应索引层级绑定排序规则,再重排索引即可:

# 定义有序分类类型,绑定指定排序
var5_cat = CategoricalDtype(categories=var5_order, ordered=True)
var6_cat = CategoricalDtype(categories=var6_order, ordered=True)

# 给行索引最外层var6设置有序分类
pivot_df.index = pivot_df.index.set_levels(
    pivot_df.index.levels[0].astype(var6_cat),
    level='var6'
)

# 给列索引最外层var5设置有序分类
pivot_df.columns = pivot_df.columns.set_levels(
    pivot_df.columns.levels[0].astype(var5_cat),
    level='var5'
)

# 分别对行、列索引按层级排序,让排序规则生效
pivot_df = pivot_df.sort_index(axis=0).sort_index(axis=1)

注意:不推荐在透视前给原始DataFrame的var5、var6转分类类型,pivot生成多级索引时可能丢失分类的有序属性,透视完成后直接处理索引层级的方案稳定性更高。如果不需要保留排序规则中存在但原始数据缺失的取值(比如S4、P4),上述代码依然适用,缺失值对应的索引不会出现在最终结果中,顺序仍符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:51