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

时间:2017-07-19 14:44:14

标签: 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='count')[['id']]

输出如下:

enter image description here

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

                    id
month    country
           us       4
  5        cn       2
           ca       1

2 个答案:

答案 0 :(得分:3)

您需要DataFrame.reset_indexDataFrame.sort_valuesDataFrame.set_index

p1 = p.reset_index()
      .sort_values(['month','id'], ascending=[1,0])
      .set_index(['month','country'])
print (p1)
               id
month country    
5     us        4
      cn        2
      ca        1
6     ca        3
      ru        3
7     cn        2
      ru        1

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

p1 = p.sort_index(level='month', sort_remaining=True) \
      .sort_values('id', ascending=False)
print (p1)
               id
month country    
5     us        4
6     ca        3
      ru        3
5     cn        2
7     cn        2
5     ca        1
7     ru        1

答案 1 :(得分:1)

选项1
这在id内按索引

month级别定义的组排序
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_remaining=Falsekind='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是数字的,我可以在它面前放一个负数下降顺序。 /耸肩

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