python - 对数据框多索引级别和按列进行排序

标签 python pandas dataframe multi-index

#Updated: pandas 版本 0.23.0 解决了这个问题

Sorting by a combination of columns and index levels


我一直在努力解决这个问题,我怀疑有更好的方法。如何按索引级别名称“idx_0”、level=0 和列“value_1”降序对以下数据框进行排序,以便列“MyName”读取垂直“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)

我怀疑有一种不重置索引的更简单的方法

            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)

先按值排序,然后对索引 level=0 进行排序,但 level=1 也会排序。

            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)

按索引 level=0 排序,然后按值排序,但 index=0 再次变得困惑。

            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)
    .sort_index(level=[0], ascending=[True]))

方法二:

 (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 上测试

关于python - 对数据框多索引级别和按列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50077922/

相关文章:

python - 访问 python egg 自己的元数据

python - 无法从 Django Rest API 获取图像

python - 如果 Pandas 中没有重复项,则将行值从一个 df append 到另一个

dataframe - Julia数据框分组依据和数据透视表功能

r - 如何在 R 中创建一个具有 mutate 函数的新列,该列是 R 中其他列的一系列值?

用于 Java 注释的 Python 正则表达式

python - 带有中文字符的 JSON 的 scrapy 管道

python - 为什么 pandas.Series([numpy.nan]).astype ("bool") 的结果是 True?

python - 如何将字典的字典展开到 pandas DataFrame 中以获得更大的字典?

python - 优先连接 Pandas 数据框