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
相关产品推荐
相关产品推荐

