按计数对pandas多索引进行排序?

时间:2016-05-09 13:32:48

标签: python sorting pandas

我有一个由多索引操作生成的数据帧,看起来像这样。

                      Col3
Col1        Col2
A              A1         N
B              B1         N
               B2         N
C              C1         N
               C2         N
               C3         N 

我正在尝试按级别A,B和C的行的降序计数对此数据帧进行排序。在这种情况下,级别A有1行,B有2行,而C有3行...所以输出将是

                      Col3
Col1        Col2
C              C1         N
               C2         N
               C3         N
B              B1         N
               B2         N
A              A1         N 

我可以想到通过实际计算每个级别的行数并向df添加一列来进行排序来手动执行此操作,但是有更优雅的方法吗?如果是这样,有没有办法推广到更多层次?

谢谢!

编辑:生成原始数据帧的代码。

df = pd.DataFrame([['a', 'z', 'x', 0.123], ['a','z', 'x', 0.234],
                ['a', 'z', 'y', 0.451], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453], ['b', 'z', 'x', 0.453]],
               columns=['first', 'second', 'value1', 'value2']
               ).set_index(['first', 'second'])

正在运行df.ix[df.groupby(level=0).size().sort_values(ascending=False).index,:]会产生TypeError: Expected tuple, got str

1 个答案:

答案 0 :(得分:2)

IIUC你可以在第一个索引级别按groupby进行,然后对size进行排序并使用它来重新索引到你的df中:

In [25]:
df.ix[df.groupby(level=0).size().sort_values(ascending=False).index,:]

Out[25]:
          Col3
Col1 Col2     
C    C1      N
     C2      N
     C3      N
B    B1      N
     B2      N
A    A1      N

打破上述情况:

In [26]:
df.groupby(level=0).size()

Out[26]:
Col1
A    1
B    2
C    3
dtype: int64

In [27]:
df.groupby(level=0).size().sort_values(ascending=False)

Out[27]:
Col1
C    3
B    2
A    1
dtype: int64

In [28]:
df.groupby(level=0).size().sort_values(ascending=False).index

Out[28]:
Index(['C', 'B', 'A'], dtype='object', name='Col1')

修改

确定这比我预期的要复杂,但以下工作:

In [76]:
i = df.index.get_level_values(0)
df.iloc[i.reindex(df.groupby(level=0).size().sort_values(ascending=False).index)[1]]

Out[76]:
             value1  value2
first second               
b     z           x   0.453
      z           x   0.453
      z           x   0.453
      z           x   0.453
a     z           x   0.123
      z           x   0.234
      z           y   0.451

这样做的是获取第一级索引值,然后reindex将它们与groupby结果对应,并使用针对原始df生成的int索引