2017-07-17 69 views
1

我用多指标(国家,年)数据帧中包含在目前的价格在当地货币单位国内生产总值数据大熊猫的工作,如计算GDP平减指数超过两个指数

   gdp 
country year  
AUS  2013 274865000000  
     2012 269562000000  
     2011 251727000000  
     2010 233604000000  
     2009 221002000000  
     2008 202260000000  
USA  2013 2550000000000 
     ...  ... 

我想创造一个含GDP平减指数以2010年为基期的新塔,例如

   gdp    gdpdef 
country year  
AUS  2013 274865000000 1.18 
     2012 269562000000 1.15 
     2011 251727000000 1.08 
     2010 233604000000 1.00 
     2009 221002000000 0.95 
     2008 202260000000 0.87 
USA  2013 2550000000000 1.01 
     ...  ...    ... 
     2010 2520000000000 1 
     .... ...    ... 

在哪里,要明确,在“gdpdef”每个条目由GDP的比例给予i国在t年对GDP的国家我在2010年。

为了与单项指标(年),我能够实现这个目的对单一国家:

base_year = df.get_value(2010, "gdp") 
df["gdpdef"] = df["gdp"].div(base_year) 

但是我有有很多的麻烦在这两个指数复制此操作(国家,年)以简洁的方式。任何帮助,为此目的非常感谢。

回答

0

您可以通过rename在地图索引创建dictmap映射列。

Multiindex使它复杂化。因此,在第一个解决方案中,使用reset_indexlevel=1用于第year列,然后用boolean indexingloc进行过滤,以用于选择列gdp

在第二个解决方案中,没有level=1参数,因此所有索引级别都转换为列。那么有必要set_index。最后加入values,因为df1df中的指标不同,所以数据不一致。

print (df) 
         gdp 
country year    
AUS  2013 274865000000 
     2012 269562000000 
     2011 251727000000 
     2010 233604000000 
     2009 221002000000 
     2008 202260000000 
USA  2013 2550000000000 
     2010 2546000000000 

df1 = df.reset_index(level=1) 
d = df1.loc[df1['year'] == 2010, 'gdp'].to_dict() 
print (d) 
{'USA': 2546000000000, 'AUS': 233604000000} 

df["gdpdef"] = df["gdp"].div(df1.rename(index=d).index) 
print (df) 
         gdp gdpdef 
country year       
AUS  2013 274865000000 1.176628 
     2012 269562000000 1.153927 
     2011 251727000000 1.077580 
     2010 233604000000 1.000000 
     2009 221002000000 0.946054 
     2008 202260000000 0.865824 
USA  2013 2550000000000 1.001571 
     2010 2546000000000 1.000000 

df1 = df.reset_index() 
d = df1[df1['year'] == 2010].set_index('country')['gdp'].to_dict() 
print (d) 
{'USA': 2546000000000, 'AUS': 233604000000} 

df["gdpdef"] = df1["gdp"].div(df1['country'].map(d)).values 
print (df) 
         gdp gdpdef 
country year       
AUS  2013 274865000000 1.176628 
     2012 269562000000 1.153927 
     2011 251727000000 1.077580 
     2010 233604000000 1.000000 
     2009 221002000000 0.946054 
     2008 202260000000 0.865824 
USA  2013 2550000000000 1.001571 
     2010 2546000000000 1.000000 

groupby和自定义功能的解决方案应该由slowier大DataFrame

def f(x): 
    x['gdpdef'] = x['gdp'].div(x.loc[x.index.get_level_values('year') == 2010, 'gdp'].item()) 
    return x 

df = df.groupby(level='country').apply(f) 
print (df) 
         gdp gdpdef 
country year       
AUS  2013 274865000000 1.176628 
     2012 269562000000 1.153927 
     2011 251727000000 1.077580 
     2010 233604000000 1.000000 
     2009 221002000000 0.946054 
     2008 202260000000 0.865824 
USA  2013 2550000000000 1.001571 
     2010 2546000000000 1.000000 
+0

万分感谢Jezrael,非常翔实的答案。 –

+0

@ Ff.Graeme - 很高兴能帮到你! – jezrael

0

尝试在Pandas中使用groupby函数。从我收集的数据来看,您希望将2010年平减指数应用于各个国家的国内生产总值。这就需要:

grouped = df.groupby("country") 
for name, group in grouped: 
    group["gdpdef"] = group["gdp"].div(base_year)