1

我正在使用 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)

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

4

2 回答 2

0

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

多索引使它复杂化。因此,在第一个解决方案中使用reset_indexwith level=1for columnyear然后过滤boolean indexingwith locfor select column 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
于 2017-07-17T03:41:02.963 回答
0

尝试groupby在 Pandas 中使用该功能。据我所知,您希望将 2010 年的平减指数按国家分别应用于每个国家的 GDP。这将需要:

grouped = df.groupby("country")
for name, group in grouped:
    group["gdpdef"] = group["gdp"].div(base_year)
于 2017-07-17T03:38:37.783 回答