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

Posted

技术标签:

【中文标题】在尊重其索引结构的同时对多索引进行排序【英文标题】:Sorting a multi-index while respecting its index structure 【发布时间】:2014-12-08 15:38:15 【问题描述】:

如何在尊重级别组织的同时对多索引数据框进行排序?

例如给定以下df,假设我们根据C对其进行排序(例如按降序排列):

                   C         D  E
A    B                           
bar  one   -0.346528  1.528538  1
     three -0.136710 -0.147842  1
flux six    0.795641 -1.610137  1
     three  1.051926 -1.316725  2
foo  five   0.906627  0.717922  0
     one   -0.152901 -0.043107  2
     two    0.542137 -0.373016  2
     two    0.329831  1.067820  1

我们应该得到:

                   C         D  E
A    B                           
bar  three -0.136710 -0.147842  1
     one   -0.346528  1.528538  1
flux three  1.051926 -1.316725  2
     six    0.795641 -1.610137  1
foo  five   0.906627  0.717922  0
     two    0.542137 -0.373016  2
     two    0.329831  1.067820  1
     two   -0.152901 -0.043107  2

请注意,我所说的“尊重其索引结构”的意思是在不更改更高级别索引的顺序的情况下对数据帧的叶子进行排序。换句话说,我想对第二级进行排序,同时保持 第一级 的顺序不变。

升序顺序做同样的事情怎么样?

我阅读了这两个主题(是的,标题相同):

Multi-Index Sorting in Pandas Multi Index Sorting in Pandas

但它们根据不同的标准(例如索引名称或组中的特定列)对数据框进行排序。

【问题讨论】:

【参考方案1】:

.reset_index,然后根据列AC排序,然后设置索引;这将比早期的groupby 解决方案更有效:

>>> df.reset_index().sort(columns=['A', 'C'], ascending=[True, False]).set_index(['A', 'B'])
                C      D  E
A    B                     
bar  three -0.137 -0.148  1
     one   -0.347  1.529  1
flux three  1.052 -1.317  2
     six    0.796 -1.610  1
foo  five   0.907  0.718  0
     two    0.542 -0.373  2
     two    0.330  1.068  1
     one   -0.153 -0.043  2

较早的解决方案:.groupby(...).apply 相对较慢,可能无法很好地扩展:

>>> df['arg-sort'] = df.groupby(level='A')['C'].apply(pd.Series.argsort)
>>> f = lambda obj: obj.iloc[obj.loc[::-1, 'arg-sort'], :]
>>> df.groupby(level='A', group_keys=False).apply(f)
                C      D  E  arg-sort
A    B                               
bar  three -0.137 -0.148  1         1
     one   -0.347  1.529  1         0
flux three  1.052 -1.317  2         1
     six    0.796 -1.610  1         0
foo  five   0.907  0.718  0         1
     two    0.542 -0.373  2         2
     two    0.330  1.068  1         0
     one   -0.153 -0.043  2         3

【讨论】:

谢谢。在您的第一个解决方案中,为什么我需要按AC 排序? @user815423426 否则会失去第一级的顺序

以上是关于在尊重其索引结构的同时对多索引进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在保持二级索引完整的同时对多索引数据框中的行进行排序

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

如何按索引级别和值对分组的多索引熊猫系列进行排序?

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

使用分类索引值对特定级别的多索引系列进行排序

在保留结构的同时划分2个多索引数据帧