计算两个指数的 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
,因为df1
和df
的索引不同,所以数据没有对齐。
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
我正在使用 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
,因为df1
和df
的索引不同,所以数据没有对齐。
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