计算两个指数的GDP平减指数

时间:2017-07-17 03:25:27

标签: python pandas economics

我正在处理大熊猫的多指数(国家,年份)数据框,其中包含当前价格的当地货币单位的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”中的每个条目都由第t年国家i的GDP与2010年国家i的GDP之比给出。

对于具有单一索引(年份)的单个国家/地区,我可以通过以下方式实现此目的:

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

但是,我很难以两个指数(国家,年份)以简洁的方式复制此操作。我们非常感谢为此提供任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用Pandas中的groupby功能。从我收集到的信息来看,您希望按国家/地区分别将2010年的平减指数应用于每个国家/地区的GDP。这将需要:

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

答案 1 :(得分:0)

您可以按dict为地图索引创建rename,或按map创建地图列。

Multiindex使它变得复杂。因此,在第一个解决方案中,对level=1列使用reset_index 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和自定义函数的解决方案应该在较大的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