首先,让我们创建一个可重现的示例。
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。