按计数排序Pandas多级索引?

4

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

                      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 = 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个回答

4

如果我理解正确,您可以通过在第一个索引级别上进行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结果匹配,并使用生成的整数索引对原始数据框进行操作。


当我运行您建议的方法时,会出现“TypeError: Expected tuple, got str”错误。df.groupby(level = 0).size() .sort_values(ascending = False).index生成了正确值的Index对象,但实际索引失败了。有任何想法吗? - Jack Florey
我正在使用pandas:0.18.1。 - Jack Florey
你能否发布原始数据和代码,以便我可以运行并尝试重新创建错误。谢谢。 - EdChum
这真的很难搞清楚,我认为它应该更容易些。 - EdChum
这个可行!非常感谢!我还在努力理解pandas的索引...还有很长的路要走。 - Jack Florey
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接