排序多索引数据框保持索引排序

Posted

技术标签:

【中文标题】排序多索引数据框保持索引排序【英文标题】:Sorting multi index data frame keeping index sorted 【发布时间】:2021-08-10 19:18:19 【问题描述】:

我有一个简单的问题我想不通。

基本上我想按列过滤多索引,但保持索引排序。

原始数据框:

arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
          ['Captive', 'Wild', 'Captive', 'Wild']]
index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
df = pd.DataFrame('Max Speed': [100, 150, 360, 20], index=index)

希望输出:

标准排序“打破”了我想保留的第一级索引。

df.sort_values('Max Speed', ascending=False).sort_index(level=0)

【问题讨论】:

【参考方案1】:

试试:

首先通过reset_index()方法重置你的索引:

df=df.reset_index()

最后使用sort_values() 方法并将set_index() 方法链接到它:

df=(df.sort_values(['Animal','Type','Max Speed'], ascending=[False,True,False])
 .set_index(['Animal','Type']))

df的输出:

                    Max Speed
Animal  Type    
Parrot  Captive     360
        Wild        20
Falcon  Captive     100
        Wild        150

【讨论】:

也可以使用stackunstack df.unstack(0).stack(0).sort_values('Animal',ascending=False,axis=1).unstack(1).stack(0) 的链,但我确信有更好的方法,也许使用reindex。 @Umar.H 是的,你是对的 有更好的方法....谢谢 :) 这是不正确的,它只是对索引进行排序而不是值将其更改为True, True 由于它是多索引,因此值也使用索引进行排序....idk 它是否适用于真实数据集,但目前它适用于 OP 提供的示例 df 如果我将升序更改为True, True,则第 0 级将排序...即 Falcon 将排在顶部

以上是关于排序多索引数据框保持索引排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框的多索引数据中按索引和值排序

在尊重其索引结构的同时对多索引进行排序

根据级别 0 索引对多索引 Pandas DataFrame 的级别 1 索引进行自定义排序

为每个级别对 Pandas 中的多索引进行不同的排序

在遵循特定结构的同时按列对多索引进行排序

Python Pandas 按多索引和列排序