【问题标题】:How can I change the order of the Multi-index using Python (Pandas) [closed]如何使用 Python(Pandas)更改多索引的顺序 [关闭]
【发布时间】:2019-01-30 08:42:20
【问题描述】:

我想知道如何使用 Python 将“Progress”重新排序为“Start-Develop-Middle-Operate”?

Python 按字母顺序自动排序,但我不希望它这样做。

谁能帮助我?

【问题讨论】:

  • 请在问题中以文本形式包含所有相关数据。我们无法从屏幕截图中复制它。
  • 最好用代码重现你的多索引

标签: python pandas multidimensional-array slice


【解决方案1】:

让我们试试这个:

df = 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)})

df = df.set_index(['Country','Progress']).T
print(df)

源数据框:

Country      France                              China                           
Progress    Develop   Middle  Operate    Start Develop   Middle  Operate    Start
NumTrans        603      661      251      110     747      780      390      346
TransValue  8662422  5226407  4679673  2589011  695373  5655969  2079905  7878596

设置为类别并定义顺序:

df.columns = df.columns.set_levels([df.columns.levels[0],
                      df.columns.levels[1].astype('category').reorder_categories(['Start','Develop','Middle','Operate'])])

#Sort the dataframe using category dtype
df = df.sort_index(axis=1)
print(df)

输出:

Country       China                             France                           
Progress      Start Develop   Middle  Operate    Start  Develop   Middle  Operate
NumTrans        346     747      780      390      110      603      661      251
TransValue  7878596  695373  5655969  2079905  2589011  8662422  5226407  4679673

更新测试缺少国家/地区的进度步骤。

df = 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)})

df = df.set_index(['Country','Progress']).T
df2 = df.drop(('China','Operate'), axis=1)
df2

输入数据帧

Country      France                               China                  
Progress    Develop   Middle  Operate    Start  Develop   Middle    Start
NumTrans        672      496      319      394      346      402      462
TransValue  6341768  5832091  9580341  5739947  6399118  6826113  1501382

Astype 和排序:

df2.columns = df2.columns.set_levels([df.columns.levels[0],
                      df2.columns.levels[1].astype('category').reorder_categories(['Start','Develop','Middle','Operate'])])

#Sort the dataframe using category dtype
df2 = df2.sort_index(axis=1)
print(df2)

输出:

Country       China                     France                           
Progress      Start  Develop   Middle    Start  Develop   Middle  Operate
NumTrans        359      496      191      886      685      814      581
TransValue  1369593  8810118  5527613  8970396  1424341  8017561  7749721

【讨论】:

  • 嗨,Scott,感谢您分享您的编码。但我尝试了代码,它返回“AttributeError:'MultiIndex'对象没有属性'sort_index'”。它还显示:“'MultiIndex' 对象没有属性 'columns'”。我可以知道如何解决这个问题吗?
  • Hrm.. @Alex 你运行的是什么版本的熊猫?如果您按原样运行此代码,它可以工作吗?如果是这样,那么我们需要确保您的输入数据框具有多索引。我现在不能和你一起工作,但我会在今晚晚些时候回来。祝你好运。
  • 嗨,斯科特,感谢您的帮助。现在可以了。但是代码似乎不适用于如果国家缺少一两个进度...我的意思是如果中国只有开发、中间和操作,索引顺序不起作用...
  • @Alex 代码仍然适用于这个给定的例子。
  • 它有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2021-09-18
  • 2021-04-28
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多