如何使用 Pandas 重新排序多索引列?

Boo*_*aka 5 multi-index pandas

表显示在这里

代码:

dff = pd.DataFrame({'Country':['France']*4+['China']*4,
                   'Progress':['Develop','Middle','Operate','Start']*2,
                   'NumTrans':np.random.randint(100,900,8),
                   'TransValue':np.random.randint(10000,9999999,8)})

dff = dff.set_index(['Country','Progress']).T
Run Code Online (Sandbox Code Playgroud)

数据和代码如上所示。

我想知道有什么方法可以使用 Python 将“进度”重新排序为 start-develop-middle-operate。

我尝试使用地图功能并用数字设置每个阶段,但无法从多索引中提取“进度”

谢谢!

piR*_*red 15

reindex

您可以指定要重新索引的级别

cats = ['Start', 'Develop', 'Middle', 'Operate']
dff.reindex(cats, axis=1, level=1)

Country      France                              China                         
Progress      Start  Develop   Middle  Operate   Start Develop  Middle  Operate
NumTrans        772      832      494      793     750     722     818      684
TransValue  7363187  2578816  9764430  4863178  159777  840700  978816  9674337
Run Code Online (Sandbox Code Playgroud)

set_levelsCategoricalIndex

您可以定义第二级的顺序,然后进行排序。

lvl1 = dff.columns.levels[1]
cats = ['Start', 'Develop', 'Middle', 'Operate']
cati = pd.CategoricalIndex(
  lvl1,
  categories=cats,
  ordered=True
)
dff.columns.set_levels(
  cati, level=1, inplace=True  
)

dff.sort_index(1)

Country      China                            France                           
Progress     Start Develop  Middle  Operate    Start  Develop   Middle  Operate
NumTrans       750     722     818      684      772      832      494      793
TransValue  159777  840700  978816  9674337  7363187  2578816  9764430  4863178
Run Code Online (Sandbox Code Playgroud)

  • 这是黄金。而你是一个救世主。谢谢@piRSquared (3认同)