【问题标题】:append to level in Multiindex pandas DataFrame在 Multiindex pandas DataFrame 中追加到级别
【发布时间】:2019-02-16 11:11:46
【问题描述】:

我的 Multiindex 数据框的结构如下所示:

                                  close       high        low       open  
   index = (timestamp,key)                                  
(2018-09-10 16:00:00, ask)       1.16023    1.16064    1.16007    1.16046
(2018-09-10 16:00:00, bid)       1.16009    1.16053    1.15992    1.16033
(2018-09-10 16:00:00, volume)  817.00000  817.00000  817.00000  817.00000

对于每个时间戳,都有对出价、要价和交易量的观察。

我试图通过计算相应的 (bid + ask)/2 来将“中间”观察值添加到索引的第二级(即 [bid,ask,volume])。

我想要的数据框应该看起来像这样

                                  close       high        low       open  
   index = (timestamp,key)                                  
(2018-09-10 16:00:00, ask)       1.16023    1.16064    1.16007    1.16046
(2018-09-10 16:00:00, bid)       1.16009    1.16053    1.15992    1.16033
(2018-09-10 16:00:00, volume)  817.00000  817.00000  817.00000  817.00000
(2018-09-10 16:00:00, mid)     1.16016      1.16059    1.15999    1.1604

最有效的方法是什么?这可以就地完成吗?

编辑:

打印数据帧的头部以更清楚地查看结构。

`bid_ask.head(5).to_dict()
Out[3]: 
{'close': {(Timestamp('2018-09-10 16:00:00'), 'ask'): 1.1602300000000001,
  (Timestamp('2018-09-10 16:00:00'), 'bid'): 1.1600900000000001,
  (Timestamp('2018-09-10 16:00:00'), 'volume'): 817.0,
  (Timestamp('2018-09-10 17:00:00'), 'ask'): 1.15977,
  (Timestamp('2018-09-10 17:00:00'), 'bid'): 1.15968},
 'high': {(Timestamp('2018-09-10 16:00:00'), 'ask'): 1.1606399999999999,
  (Timestamp('2018-09-10 16:00:00'), 'bid'): 1.1605300000000001,
  (Timestamp('2018-09-10 16:00:00'), 'volume'): 817.0,
  (Timestamp('2018-09-10 17:00:00'), 'ask'): 1.16039,
  (Timestamp('2018-09-10 17:00:00'), 'bid'): 1.16029},
 'low': {(Timestamp('2018-09-10 16:00:00'), 'ask'): 1.1600699999999999,
  (Timestamp('2018-09-10 16:00:00'), 'bid'): 1.1599200000000001,
  (Timestamp('2018-09-10 16:00:00'), 'volume'): 817.0,
  (Timestamp('2018-09-10 17:00:00'), 'ask'): 1.1596200000000001,
  (Timestamp('2018-09-10 17:00:00'), 'bid'): 1.1595299999999999},
 'open': {(Timestamp('2018-09-10 16:00:00'), 'ask'): 1.16046,
  (Timestamp('2018-09-10 16:00:00'), 'bid'): 1.1603300000000001,
  (Timestamp('2018-09-10 16:00:00'), 'volume'): 817.0,
  (Timestamp('2018-09-10 17:00:00'), 'ask'): 1.1601900000000001,
  (Timestamp('2018-09-10 17:00:00'), 'bid'): 1.1600999999999999}}
 `

【问题讨论】:

  • 我发布了一个答案,因为您是一个新用户,所以很多人发现一些现有的解决方案令人困惑。希望您能看到这个问题与以下stackoverflow.com/a/24918803/4013571 非常相似,我建议您看看您是否也可以遵循该答案
  • 从这里的粘贴中找出框架的结构并不容易。请运行 df.head(5).to_dict() 并将输出粘贴到您的问题中。

标签: python pandas multi-index


【解决方案1】:

我不完全确定您的 DataFrame 的结构,但这是本质

df.loc[('2018-09-10 16:00:00', 'mid'), :] = [1.16016, 1.16059, 1.15999 , 1.1604]

您需要做的就是使用df.loc 并为MultiIndex 提供一个 元组

我猜我假设你的新 MultiIndex 条目是 ('2018-09-10 16:00:00', 'mid')

示例

In [353]: ref

Out[353]:
       Names  Values
  idx2
1 one      A       5
2 two      B      10

In [354]: ref.loc[(3, 'three'), :] = ['C', 15]

In [355]: ref
Out[355]:
        Names  Values
  idx2
1 one       A     5.0
2 two       B    10.0
3 three     C    15.0

【讨论】:

  • 感谢亚历克斯。有没有办法对索引的时间戳级别中的每个值执行此操作,即类似于 bid_ask.loc[(:,"mid), :] = 0.5 * ( bid_ask.loc[(:,"bid ), :] + bid_ask.loc[(:,"ask), :] ) 。我不确定在 Multiindex 对象上切片是如何工作的。
猜你喜欢
  • 2018-06-24
  • 2018-11-09
  • 2019-03-05
  • 2016-03-05
  • 2017-10-16
  • 2015-07-19
  • 2020-09-16
  • 2014-05-24
相关资源
最近更新 更多