【问题标题】:MultiIndex Group By in Pandas Data FramePandas 数据框中的 MultiIndex Group By
【发布时间】:2014-04-08 12:40:31
【问题描述】:

我有一个数据集,其中包含按年份划分的国家和经济指标统计数据,按如下方式组织:

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'])

但它不能正常工作。

【问题讨论】:

    标签: python pandas dataset dataframe


    【解决方案1】:

    这是你要找的东西吗:

    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
    

    【讨论】:

      【解决方案2】:

      在这种情况下,您实际上不需要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 方法获取数据框的横截面:

      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 方法而不是上面的解决方案?
      • @Barnaby 因为您的数据不需要以任何方式汇总。它们都是独特的价值。例如,groupby 适用于确定所有 GDP 的总和或人口中位数等。您要查找的只是数据框中已有的值。
      • @Barnaby 我添加了一些 grouby 示例
      • 感谢您的扩展,这对您很有帮助。
      • 感谢巧妙的数据生成技巧。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2016-12-31
      • 2019-12-24
      • 2021-06-14
      • 1970-01-01
      • 2021-04-12
      • 2018-02-20
      相关资源
      最近更新 更多