【问题标题】:How to re-order the multi-index columns using Pandas?如何使用 Pandas 重新排序多索引列?
【发布时间】:2019-02-02 09:23:10
【问题描述】:

Table is shown here

代码:

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

数据和代码如上所示。

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

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

谢谢!

【问题讨论】:

标签: pandas multi-index


【解决方案1】:

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

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

【讨论】:

  • 这是黄金。而你是救世主。谢谢@piRSquared
  • 相对于我见过的其他答案非常简单。谢谢!
  • 谢谢!在我的例子中,我使用df.reindex(cats, axis=1, level=0) 来获得我想要的形状。
猜你喜欢
  • 2019-03-26
  • 2018-10-28
  • 2019-02-05
  • 2021-06-09
  • 2017-08-29
  • 2016-01-16
  • 2012-09-02
  • 2017-12-14
  • 2020-01-04
相关资源
最近更新 更多