使用切片将行添加到多索引数据帧

2024-05-16 07:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据框是这样的

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"), :])

不过,这要花费更长的时间,特别是如果我的数据集很大,因此不受欢迎的话

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


Tags: 数据closeoutlevelheadloctimestampask
1条回答
网友
1楼 · 发布于 2024-05-16 07:02:44

使用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

相关问题 更多 >