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

