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

Pandas透视表如何保留索引的原始排序?

如何在Pandas透视操作后保留原始索引顺序?

这个问题我之前也碰到过!Pandas 1.4.3版本的pivot方法默认会对生成的索引进行字典序排序,所以才会打乱你原本按纬度排列的TILE顺序。这里有两个实用的解决方案,都能帮你保留原始的排序:

方法一:将TILE转为分类类型(推荐,后续操作也能保留顺序)

在执行透视前,把TILE列转换成分类类型,并指定它的顺序为原始数据中首次出现的唯一值顺序。这样Pandas在透视时就会遵循这个预设顺序,不会自动排序。

import pandas as pd

dummy = [{'TILE':'N59TE010A','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59TE009G','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59RE009G','METRIC':'ELD_RMSE','LOW':1}, {'TILE':'N59TE010B','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59TE010C','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'S24TW047F','METRIC':'RUF_RMSE','LOW':2}, {'TILE':'S24TW047G','METRIC':'ELD_LE90','LOW':2}, {'TILE':'S24MW047D','METRIC':'SMD_LE90','LOW':2}, {'TILE':'S24MW047C','METRIC':'RUF_RMSE','LOW':0}, {'TILE':'S24MW047D','METRIC':'RUF_RMSE','LOW':0}]
df = pd.DataFrame.from_dict(dummy)

# 获取TILE的原始唯一顺序(保留首次出现的顺序)
original_tile_order = df['TILE'].unique()
# 将TILE转为分类类型,指定顺序
df['TILE'] = pd.Categorical(df['TILE'], categories=original_tile_order, ordered=True)

# 执行透视
pivoted_df = df.pivot(index='TILE', columns='METRIC', values='LOW')
print(pivoted_df)

输出的索引顺序就会和你原始数据中TILE的出现顺序完全一致:

METRIC      ELD_LE90  ELD_RMSE  RUF_RMSE  SMD_LE90
TILE
N59TE010A        NaN       2.0       NaN       NaN
N59TE009G        NaN       2.0       NaN       NaN
N59RE009G        NaN       1.0       NaN       NaN
N59TE010B        NaN       2.0       NaN       NaN
N59TE010C        NaN       2.0       NaN       NaN
S24TW047F        NaN       NaN       2.0       NaN
S24TW047G        2.0       NaN       NaN       NaN
S24MW047D        NaN       NaN       0.0       2.0
S24MW047C        NaN       NaN       0.0       NaN

方法二:透视后重新索引(快速,不修改原数据)

如果你不想修改原DataFrame的列类型,可以先执行透视,再用reindex方法按照原始的TILE顺序重新排列结果:

import pandas as pd

dummy = [{'TILE':'N59TE010A','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59TE009G','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59RE009G','METRIC':'ELD_RMSE','LOW':1}, {'TILE':'N59TE010B','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'N59TE010C','METRIC':'ELD_RMSE','LOW':2}, {'TILE':'S24TW047F','METRIC':'RUF_RMSE','LOW':2}, {'TILE':'S24TW047G','METRIC':'ELD_LE90','LOW':2}, {'TILE':'S24MW047D','METRIC':'SMD_LE90','LOW':2}, {'TILE':'S24MW047C','METRIC':'RUF_RMSE','LOW':0}, {'TILE':'S24MW047D','METRIC':'RUF_RMSE','LOW':0}]
df = pd.DataFrame.from_dict(dummy)

# 先执行透视
pivoted_df = df.pivot(index='TILE', columns='METRIC', values='LOW')
# 按原始TILE的唯一顺序重新索引
pivoted_df = pivoted_df.reindex(df['TILE'].unique())
print(pivoted_df)

这个方法的输出和方法一完全一致,好处是不会改变原数据的结构,适合临时调整的场景。

为什么会出现这个问题?

在Pandas 1.5.0之前,pivot方法默认会对索引和列进行排序(这是旧版本的设计)。直到1.5.0才新增了sort=False参数,可以直接关闭自动排序。但你用的是1.4.3,所以只能通过上面两种方法来绕过这个默认行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:57:32