首页 > 解决方案 > 使用切片将行添加到多索引数据帧

问题描述

我的数据框看起来像这样

bid_ask.head(6)
Out[3]: 
                                close        high         low        open
timestamp           direction                                                
2018-08-16 21:00:00 bid           1.27156     1.27189     1.26899     1.27100
                    ask           1.27177     1.27270     1.27067     1.27210
                    volume     1254.00000  1254.00000  1254.00000  1254.00000
2018-08-16 22:00:00 bid           1.27131     1.27154     1.27112     1.27152
                    ask           1.27152     1.27195     1.27138     1.27173
                    volume      242.00000   242.00000   242.00000   242.00000

我正在尝试对我的数据帧执行以下操作,以使用 pd.IndexSlice 添加行,以模拟具有简单数据帧索引的情况。

bid_ask.loc[pd.IndexSlice[:, 'mid'], :] = 0.5 * bid_ask.loc[pd.IndexSlice[:, ('bid', 'ask')], :].groupby(level="timestamp").sum() 

但是,我收到以下错误:

KeyError: 'mid'

似乎它希望“mid”在数据框中而不是插入它。

我可以通过执行以下操作来达到预期的结果

 for i in bid_ask.index.get_level_values(0):

        bid_ask.ix[(i, "mid"), :] = 0.5 * (bid_ask.ix[(i, "bid"), :] + 
        bid_ask.ix[(i, "ask"), :])

但这需要更长的时间,特别是如果我的数据集很大,因此是不可取的。

如何通过切片或任何其他更快的替代方法来实现这一点?

标签: pythonpandasslicemulti-index

解决方案


使用MultiIndexconcat

new=0.5 * df.loc[pd.IndexSlice[:, ('bid', 'ask')], :].groupby(level="timestamp").sum()
new.index=pd.MultiIndex.from_product([new.index, ['mid']])
pd.concat([df,new]).sort_index()
Out[81]: 
                             close         high         low         open
timestamp   direction                                                   
2018-08-161 ask           1.271770     1.272700     1.27067     1.272100
            bid           1.271560     1.271890     1.26899     1.271000
            mid           1.271665     1.272295     1.26983     1.271550
            volume     1254.000000  1254.000000  1254.00000  1254.000000
2018-08-162 ask           1.271520     1.271950     1.27138     1.271730
            bid           1.271310     1.271540     1.27112     1.271520
            mid           1.271415     1.271745     1.27125     1.271625
            volume      242.000000   242.000000   242.00000   242.000000

推荐阅读