Pandas 数据框中的 MultiIndex Group By
Posted
技术标签:
【中文标题】Pandas 数据框中的 MultiIndex Group By【英文标题】:MultiIndex Group By in Pandas Data Frame 【发布时间】: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'])
但它不能正常工作。
【问题讨论】:
【参考方案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
示例
感谢您的扩展,这对您很有帮助。
感谢巧妙的数据生成技巧。以上是关于Pandas 数据框中的 MultiIndex Group By的主要内容,如果未能解决你的问题,请参考以下文章
Pandas GroupBy 和 MultiIndex 上列级别的最大值