如何在保持行列原有顺序的前提下对Pandas DataFrame执行pivot操作
解决方案:保持Pivot后的行列原始顺序
要解决pivot后丢失period行顺序和指定列顺序的问题,核心是锁定原始顺序的分类类型+手动指定列层级顺序,具体步骤如下:
1. 提取原始顺序
先从原始DataFrame中获取period和shortCode的原始出现顺序(不做排序):
import pandas as pd # 提取period的原始顺序 original_periods = df_tc['period'].unique() # 提取shortCode的原始顺序 original_shortcodes = df_tc['shortCode'].unique()
2. 将字段转为有序分类
把period和shortCode转为Categorical类型并指定原始顺序为分类规则,这样pivot时不会自动排序:
df_tc['period'] = pd.Categorical(df_tc['period'], categories=original_periods, ordered=True) df_tc['shortCode'] = pd.Categorical(df_tc['shortCode'], categories=original_shortcodes, ordered=True)
3. 执行Pivot并修正列顺序
执行pivot后,由于values参数的列表会被默认按字母排序(比如$/mt会排在WS前面),需要手动构造期望的列层级并重新排列:
# 执行pivot df_test = df_tc.pivot( index='period', columns='shortCode', values=['WS', '$/mt', 'change'] ) # 构造符合要求的列层级:先按WS、$/mt、change,再按原始shortCode顺序 desired_columns = pd.MultiIndex.from_product( [['WS', '$/mt', 'change'], original_shortcodes], names=['metric', 'shortCode'] ) # 重新排列列 df_test = df_test[desired_columns]
效果验证
- 行顺序:period会严格保留原始DataFrame中的出现顺序(比如Jan-23在前,Feb-23在后)
- 列顺序:先按
WS→$/mt→change的顺序排列第一层,第二层按原始shortCode的顺序排列(比如TC2在前,TC5在后)
示例对比
原始DataFrame:
| shortCode | period | WS | $/mt | change |
|---|---|---|---|---|
| TC2 | Jan-23 | 100 | 50 | 2 |
| TC5 | Jan-23 | 150 | 75 | 3 |
| TC2 | Feb-23 | 110 | 55 | 1 |
| TC5 | Feb-23 | 160 | 80 | 4 |
处理后得到的期望结果:
| period | WS | $/mt | change | |||
|---|---|---|---|---|---|---|
| TC2 | TC5 | TC2 | TC5 | TC2 | TC5 | |
| Jan-23 | 100 | 150 | 50 | 75 | 2 | 3 |
| Feb-23 | 110 | 160 | 55 | 80 | 1 | 4 |
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

