我正在处理大熊猫的多指数(国家,年份)数据框,其中包含当前价格的当地货币单位的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)
但是,我很难以两个指数(国家,年份)以简洁的方式复制此操作。我们非常感谢为此提供任何帮助。
答案 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 indexing
按loc
过滤选择列gdp
。
在第二个解决方案中没有level=1
参数,因此所有索引级别都转换为列。那么必要set_index
。最后添加了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