Pandas数据框中的MultiIndex分组

8
我有一个数据集,其中包含按年份组织的国家和经济指标统计数据,结构如下所示:
Country  Metric           2011   2012   2013  2014
  USA     GDP               7      4     0      2
  USA     Pop.              2      3     0      3
  GB      GDP               8      7     0      7
  GB      Pop.              2      6     0      0
  FR      GDP               5      0     0      1
  FR      Pop.              1      1     0      5

我该如何在pandas中使用MultiIndex来创建一个数据框,只显示每个国家每年的GDP?

我尝试了:

df = data.groupby(['Country', 'Metric'])

但它没有正常工作。
2个回答

31

在这种情况下,实际上您不需要使用groupby。您也没有MultiIndex。您可以像这样创建一个:

在这种情况下,实际上您不需要使用groupby。您也没有MultiIndex。您可以这样做:

import pandas
from io import StringIO

datastring = StringIO("""\
Country  Metric           2011   2012   2013  2014
USA     GDP               7      4     0      2
USA     Pop.              2      3     0      3
GB      GDP               8      7     0      7
GB      Pop.              2      6     0      0
FR      GDP               5      0     0      1
FR      Pop.              1      1     0      5
""")
data = pandas.read_table(datastring, sep='\s\s+')
data.set_index(['Country', 'Metric'], inplace=True)

然后,data 的内容看起来像这样:

                2011  2012  2013  2014
Country Metric                        
USA     GDP        7     4     0     2
        Pop.       2     3     0     3
GB      GDP        8     7     0     7
        Pop.       2     6     0     0
FR      GDP        5     0     0     1
        Pop.       1     1     0     5

现在要获取GDP,可以通过xs方法对数据框进行截面分析:

Translated:

现在要获取GDP,可以通过xs方法对数据框进行截面分析:

data.xs('GDP', level='Metric')

         2011  2012  2013  2014
Country                        
USA         7     4     0     2
GB          8     7     0     7
FR          5     0     0     1

因为您的数据已经被透视/展开,所以这非常容易。如果它们没有被这样处理并且看起来像这样:

data.columns.names = ['Year']
data = data.stack()
data

Country  Metric  Year
USA      GDP     2011    7
                 2012    4
                 2013    0
                 2014    2
         Pop.    2011    2
                 2012    3
                 2013    0
                 2014    3
GB       GDP     2011    8
                 2012    7
                 2013    0
                 2014    7
         Pop.    2011    2
                 2012    6
                 2013    0
                 2014    0
FR       GDP     2011    5
                 2012    0
                 2013    0
                 2014    1
         Pop.    2011    1
                 2012    1
                 2013    0
                 2014    5

接着您可以使用groupby来了解整个世界的一些情况:

data.groupby(level=['Metric', 'Year']).sum()
Metric  Year
GDP     2011    20
        2012    11
        2013     0
        2014    10
Pop.    2011     5
        2012    10
        2013     0
        2014     8

或者变得更加高级:

data.groupby(level=['Metric', 'Year']).sum().unstack(level='Metric')
Metric  GDP  Pop.
Year             
2011     20     5
2012     11    10
2013      0     0
2014     10     8

有什么原因我会使用xs方法而不是上面的解决方案吗? - metersk
@Barnaby 因为你的数据不需要以任何方式进行聚合。它们都是唯一的值。例如,groupby 可用于确定所有 GDP 的总和或中位数人口等。你要找的只是数据框中已有的值。 - Paul H
@Barnaby 我添加了一些 grouby 的示例。 - Paul H
感谢您的扩展,这对我们非常有帮助。 - metersk
1
感谢您提供的整洁数据生成技巧。 - MrR

3
这是您要找的内容吗:
df = df.groupby(['Metric'])
df.get_group('GDP')

   Country Metric  2011    2012    2013    2014
0    USA     GDP     7      4       0       2
2    GB      GDP     8      7       0       7
4    FR      GDP     5      0       0       1

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