【问题标题】:Outer index to ascending, inner index to descending in multi-index pandas在多索引熊猫中,外部索引升序,内部索引降序
【发布时间】:2019-07-29 22:52:31
【问题描述】:

我有一个多索引数据框,我要对它进行排序索引。

对于外部索引,我希望它按升序排列,而对于我的第二个索引,我希望它按降序排列。

我试过了

df 是我的数据框的名称

df.sort_index(level="outer")
df.sort_index(level="inner", ascending=False)

每个外部索引有 20 个内部索引。

【问题讨论】:

  • 请添加df的定义,以便示例可重现。

标签: python pandas


【解决方案1】:

首先,让我们创建一个可重现的示例。

In [1]: import numpy as np
   ...: import pandas as pd
   ...: np.random.seed(1)
   ...: index = pd.MultiIndex.from_product([[1, 2, 3], [1, 2, 3, 4]], names=['outer', 'inner'])
   ...: inds = list(range(len(index)))
   ...: np.random.shuffle(inds)
   ...: index = index[inds]
   ...: data = np.arange(len(index))
   ...: df = pd.DataFrame(index=index, data=data, columns=['A'])
   ...: df
Out[1]: 
              A
outer inner    
1     3       0
      4       1
2     1       2
3     3       3
1     2       4
2     3       5
1     1       6
2     4       7
3     4       8
      2       9
      1      10
2     2      11

所以 pd.DataFrame.sort_levels 不允许我们同时以不同的顺序对级别进行排序,但我们可以将它们逐个排序并将结果组合在一起。

In [2]: (df
   ...:  .sort_index(level='outer', sort_remaining=False)
   ...:  .groupby(level='outer').apply(lambda df: df.sort_index(level='inner', ascending=False))
   ...:  .reset_index(level=0, drop=True)
   ...: )
Out[2]: 
              A
outer inner    
1     4       1
      3       0
      2       4
      1       6
2     4       7
      3       5
      2      11
      1       2
3     4       8
      3       3
      2       9
      1      10

虽然您没有描述您的数据,但我不知道在您的情况下是否有可能,使用数字内部索引值,您可以通过乘以 -1 来实现您想要的,将两个索引排序在同样的时间,然后再乘以-1。

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2014-10-24
    • 2016-10-16
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2019-10-28
    相关资源
    最近更新 更多