在一个级别进行分组和排序,显示另一个级别

时间:2013-04-19 17:18:52

标签: python pandas

以下示例

import pandas as pd
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Ohio', 'Ohio',
                  'Nevada', 'Nevada','Nevada','Nevada'],
        'year': [2000, 2000, 2000, 2002, 2002,
                 2002, 2002, 2002, 2002],
        'pop': [1, 1, 1, 1, 1, 1, 1, 1, 1]}
df = pd.DataFrame(data)

输出

   pop   state  year
0    1    Ohio  2000
1    1    Ohio  2000
2    1    Ohio  2000
3    1    Ohio  2002
4    1    Ohio  2002
5    1  Nevada  2002
6    1  Nevada  2002
7    1  Nevada  2002
8    1  Nevada  2002

我需要pop上的总和,对于每个州+年组合,然而,排序需要基于州级别。

所以我需要在计数内计数,在第一级完成订购。输出就像

  state  year  sum
   Ohio  2000  3
         2002  2
   Nev.  2002  4

正如你所看到的那样,俄亥俄州名列前茅,因为在总和5的情况下,整个团队有更多的项目。

显示是关键,我想只向俄亥俄州显示一次。

我相信我需要在Pandas上使用分层索引,但我无法弄清楚确切的语法。堆叠/取消堆叠在这里有用吗?

1 个答案:

答案 0 :(得分:4)

stack()unstack() 可以帮助,是的,还有reindex()

In [11]: res = df.groupby(['state', 'year']).sum()

In [12]: res
Out[12]: 
             pop
state  year     
Nevada 2001    1
       2002    3
Ohio   2000    3
       2002    2

In [13]: st = np.sort(df.groupby('state')['pop'].sum())[::-1]

In [14]: st
Out[14]: 
state
Ohio      5
Nevada    4
Name: pop

In [15]: res.unstack().reindex(st.index).stack()
Out[15]: 
             pop
state  year     
Ohio   2000    3
       2002    2
Nevada 2001    1
       2002    3

虽然我不确定它是否是最优雅的解决方案。我让pandas功夫大师在这里说出他们的智慧之词。