2014-03-06 106 views
5

我有一個包含國家和對今年經濟指標的統計數據集,像這樣組織:多指標集團通過熊貓數據幀

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 

如何使用多指標的大熊貓建立一個數據幀僅顯示每個國家的GDP年份?

我想:

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

,但它並沒有正常工作。

回答

21

在這種情況下,你實際上並不需要一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 
+0

爲什麼我會使用'xs'方法而不是上面的解決方案? – metersk

+0

@Barnaby因爲您的數據不需要以任何方式進行彙總。它們都是獨一無二的價值。例如,「groupby」適用於確定所有GDP或總人口中位數的總和等。您要查找的所有值都是數據框中已有的值。 –

+0

啊,好吧。這很有道理,謝謝。 – metersk

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