按列对数据框多索引级别进行排序 [英] Sort dataframe multiindex level and by column

查看:49
本文介绍了按列对数据框多索引级别进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为此感到挣扎,我怀疑还有更好的方法.如何按索引级别名称'idx_0',级别= 0和列'value_1'降序排列以下数据框,以使列'MyName'读取垂直的'SCOTTBOSTON'.

I have struggled with this and I suspect there is a better way. How do I sort the following dataframe by index level name 'idx_0', level=0 and by column, 'value_1' descending such that the column 'MyName' reads vertical 'SCOTTBOSTON'.

import pandas as pd
import numpy as np
df = pd.DataFrame({'idx_0':[2]*6+[1]*5,
                   'idx_1':[6,4,2,10,18,5,11,1,7,9,3],
                   'value_1':np.arange(11,0,-1),
                   'MyName':list('BOSTONSCOTT')})

df = df.set_index(['idx_0','idx_1'])
df

输出:

            MyName  value_1
idx_0 idx_1                
2     6          B       11
      4          O       10
      2          S        9
      10         T        8
      18         O        7
      5          N        6
1     11         S        5
      1          C        4
      7          O        3
      9          T        2
      3          T        1

使用以下输出除外:

df.sort_values(['value_1'], ascending=False)\
  .reindex(sorted(df.index.get_level_values(0).unique()), level=0)

我怀疑没有重置索引的简便方法

I suspect there is an easier way without resetting indexes

            MyName  value_1
idx_0 idx_1                
1     11         S        5
      1          C        4
      7          O        3
      9          T        2
      3          T        1
2     6          B       11
      4          O       10
      2          S        9
      10         T        8
      18         O        7
      5          N        6

失败#1:

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

先按值排序,然后对索引级别0进行排序,但对级别1也进行排序.

Sort by values first then sort index level=0, but level=1 get sorted also.

            MyName  value_1
idx_0 idx_1                
1     1          C        4
      3          T        1
      7          O        3
      9          T        2
      11         S        5
2     2          S        9
      4          O       10
      5          N        6
      6          B       11
      10         T        8
      18         O        7

失败#2

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

按索引级别= 0排序,然后按值排序,但索引= 0再次变得混乱.

Sort by index level=0 then sort by values, but index=0 gets jumbled again.

            MyName  value_1
idx_0 idx_1                
2     6          B       11
      4          O       10
      2          S        9
      10         T        8
      18         O        7
      5          N        6
1     11         S        5
      1          C        4
      7          O        3
      9          T        2
      3          T        1

推荐答案

以下是您需要的一些潜在解决方案:

Here are some potential solutions for your needs:

方法1:

 (df.sort_values('value_1', ascending=False)
    .sort_index(level=[0], ascending=[True]))

方法2:

 (df.set_index('value_1', append=True)
    .sort_index(level=[0,2], ascending=[True,False])
    .reset_index('value_1'))

在pandas 0.22.0,Python 3.6.4上进行了测试

Tested on pandas 0.22.0, Python 3.6.4

这篇关于按列对数据框多索引级别进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆