多索引数据帧的列差异

时间:2021-04-23 10:54:02

标签: python pandas multi-index

我(可能)遇到了一个非常简单的问题,我现在无法解决这个问题。我正在收集以下两个系列:

from pandas_datareader import wb
countries = [
            'DZA', 'ARM','AZE','BLR','BIH','BRN','KHM','CHN','HRV', 'CZE','EGY',\
             'EST','GEO','HUN','IND','IDN','ISR','JPN','JOR','KAZ','KOR','KGZ','LAO','LVA',\
             'LBN','LTU','MYS','MDA','MNG','MMR','MKD','PHL','POL','ROU', 'RUS','SAU',\
             'SGP','SVK','SVN','TJK','THA','TUR','UKR','UZB','VNM'
]
dat = wb.download(indicator='FR.INR.LEND', country=countries, start=2010, end=2019)
dat.columns = ['lending_rate']
us = wb.download(indicator='FR.INR.LEND', country='US', start=2010, end=2019)
us.columns = ['lending_rate_us']
dat2=pd.concat([dat,us])
dat2

我想计算 lending_ratelending_rate_us 之间的差异,但显然想从所有其他国家/地区的 lending_rate_us 中减去仅美国的 lending_rate(即. 避免否则会导致 NAN 无处不在)。

所以我想我想要做的是将 lending_rate_us 的值复制到所有其他国家/地区,然后计算两列之间的差异。

有没有人知道如何做到这一点(或者更有意义的替代想法)?

谢谢!

编辑:

我尝试了以下方法,可惜没有成功:

from pandas_datareader import wb
countries = [
            'DZA', 'ARM','AZE','BLR','BIH','BRN','KHM','CHN','HRV', 'CZE','EGY',\
             'EST','GEO','HUN','IND','IDN','ISR','JPN','JOR','KAZ','KOR','KGZ','LAO','LVA',\
             'LBN','LTU','MYS','MDA','MNG','MMR','MKD','PHL','POL','ROU', 'RUS','SAU',\
             'SGP','SVK','SVN','TJK','THA','TUR','UKR','UZB','VNM'
]
dat = wb.download(indicator='FR.INR.LEND', country=countries, start=2010, end=2019)
dat.columns = ['lending_rate']
us = wb.download(indicator='FR.INR.LEND', country='US', start=2010, end=2019)
us.columns = ['lending_rate']

for i in dat.index.get_level_values(0).unique():
    dat["lending_rate_spread"]=dat.loc[i,:]-us.loc["United States",:]
dat

输出:

        lending_rate    lending_rate_spread
country year        
Armenia 
2019    12.141989   NaN
2018    12.793042   NaN
2017    14.406002   NaN
2016    17.356706   NaN
2015    17.590330   NaN
... ... ... ...
Vietnam 
2014    8.665000    NaN
2013    10.374167   NaN
2012    13.471667   NaN
2011    16.953833   NaN
2010    13.135250   NaN
450 rows × 2 columns

但是当我只打印循环的结果而不创建新列时,我得到了正确的值:

for i in dat.index.get_level_values(0):
    print(dat.loc[i,:]-us.loc["United States",:])

输出:

      lending_rate
year              
2019      6.859489
2018      7.888875
2017     10.309335
2016     13.845039
2015     14.330330
2014     13.158665
2013     12.744987
2012     13.980068
2011     14.504474
2010     15.950428
      lending_rate
year              
2019     11.998715
2018     12.544167
2017     12.445833
2016     12.863560
2015     14.274167

我不明白为什么我会得到正确的结果,但不能以正确的方式呈现?

1 个答案:

答案 0 :(得分:0)

针对您的评论,我再次查看了数据。由于 NA 数据存在,我重新处理了每个国家/地区的数据,发现所有数据都是 10 年。 @Paul评论的方法是可以的,所以修改了代码。

"
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Response>
    <Message>
        <Body>Sorry, the command  is invalid.</Body>
    </Message>
</Response>"