Python 如何在Pandas中对透视表进行排序

Python 如何在Pandas中对透视表进行排序,python,pandas,Python,Pandas,代码如下: test = pd.DataFrame({'country':['us','ca','ru','cn','ru','cn','us','ca','ru','cn','us','ca','ru','cn','us','ca'], 'month':[5,6,7,5,6,7,5,5,6,7,5,6,6,5,5,6], 'id':[x for x in range(16)]}) p = test.pivot_table(index=['month', 'country'], aggfunc=

代码如下:

test = pd.DataFrame({'country':['us','ca','ru','cn','ru','cn','us','ca','ru','cn','us','ca','ru','cn','us','ca'], 'month':[5,6,7,5,6,7,5,5,6,7,5,6,6,5,5,6], 'id':[x for x in range(16)]})
p = test.pivot_table(index=['month', 'country'], aggfunc='count')[['id']]
输出如下所示:

我想按
id
列对表进行排序,以便最大的数字出现在顶部,如:

                    id
month    country
           us       4
  5        cn       2
           ca       1
您需要,并且:

因为此解决方案不起作用:(


选项1
这将根据索引中的
month
级别定义的组内的
id
进行排序

p.groupby(
    level='month', group_keys=False
).apply(pd.DataFrame.sort_values, by='id', ascending=False)

               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1

选项2
这首先按照
id
对整个数据帧进行排序,然后再按照索引中的
month
级别进行排序。然而,出于不言自明的原因,我不得不使用
sort\u remaining=False
,并且
kind='mergesort'
因为
mergesort
是一种稳定的排序,不会扰乱组中预先存在的顺序由“月”级别定义

p.sort_values('id', ascending=False) \
 .sort_index(level='month', sort_remaining=False, kind='mergesort')

               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1

选项3
这使用了numpy的
lexsort
…这是可行的,但我不喜欢它,因为它依赖于
id
是数字,并且我能够在它前面放一个负数以获得降序。/shugh

p.iloc[np.lexsort([-p.id.values, p.index.get_level_values('month')])]

               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1

@斯科特伯顿-这个问题真的很难回答,我试图在github中找到一些关于它的问题,但没有成功(
p.sort_values('id', ascending=False) \
 .sort_index(level='month', sort_remaining=False, kind='mergesort')

               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1
p.iloc[np.lexsort([-p.id.values, p.index.get_level_values('month')])]

               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1