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

如何在保持行列原有顺序的前提下对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:

shortCodeperiodWS$/mtchange
TC2Jan-23100502
TC5Jan-23150753
TC2Feb-23110551
TC5Feb-23160804

处理后得到的期望结果:

periodWS$/mtchange
TC2TC5TC2TC5TC2TC5
Jan-23100150507523
Feb-23110160558014

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:25:32