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"), :])
但这需要更长的时间,特别是如果我的数据集很大,因此是不可取的。
如何通过切片或任何其他更快的替代方法来实现这一点?
解决方案
使用MultiIndex
和concat
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
推荐阅读
- amazon-web-services - 将自定义域添加到 lambda 的最佳方法?
- odoo - 如何在odoo树视图onclick按钮中创建记录?
- php - 如何在服务器上使用 SSH 命令执行本地 Shell 脚本?
- angular - 角度示意图:未找到:我的示意图错误
- c# - c#中new object()到底做了什么
- python - 如何在Python中提取第一个字符
- javascript - 用 Javascript 编写代码,使用 if、else 和 prompt。
- java - 找不到参数的方法 abiFilters() [x86]
- c++ - 使用模板前向声明所有未来函数会导致歧义,而不是将声明与定义配对
- mysql - 使用 javafx 将图像上传到数据库