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

Computing GDP deflators over two indices

我正在使用 pandas 中的多指数(国家、年份)数据框,其中包含按当前价格以当地货币单位表示的 GDP 数据,例如

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

我想创建一个包含以 2010 年为基准年的 GDP 平减指数的新列,例如

                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" 中的每个条目均由国家 i 在 t 年的 GDP 与国家 i 在 2010 年的 GDP 的比率给出。

对于具有单一指数(年份)的单一国家,我可以通过以下方式实现这一目标:

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

但是,我在以简洁的方式在两个指数(国家、年份)上复制此操作时遇到了很多麻烦。非常感谢为此提供的任何帮助。

尝试使用 Pandas 中的 groupby 函数。据我了解,您希望将 2010 年平减指数分别应用于每个国家/地区的 GDP。这将需要:

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

您可以通过 rename 创建地图索引 dict 或通过 map 创建地图列。

Multiindex复杂化了。所以在第一个解决方案中使用 reset_index with level=1 for column year and then filter by boolean indexing with loc 作为 select 列 gdp.

第二个解决方案没有level=1参数,因此所有索引级别都转换为列。那么就需要set_index. Last was added 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