我有两个数据框:数据和位置。
数据具有多重索引:“日期”和“符号”。 位置具有一个索引:“日期”(并且带有标签为“符号”的列)。 这两个“日期”都是DatetimeIndexes。
我想为 Positions 中的所有日期(索引)从数据到 Positions 中获取“打开”值。
如果我尝试以下操作:
positions['Open_price'] = data.loc['1997-02-10','AA'].Open
对于整个 Positions 数据框的'Open_price'字段,我在1997-02-10正确获得了'AA'符号的'Open'值。 但是,我的目标是获取相关日期(索引)和符号(列值)的“开盘价”。
所以我试试这个:
positions['Open_price'] = data.loc[positions.index,positions.Symbol].Open
然后我得到一个错误:
KeyError: "None of [DatetimeIndex(['1999-01-01', ...\n '2018-07-30'],\n
dtype='datetime64[ns]', length=7151, freq='D')]
are in the [index]"
注意: 重要的是,数据的“日期”索引中缺少值(周末)。 位置“日期”索引没有丢失的日期。
我该如何做?
重要提示:
可接受的答案有效,但我需要将熊猫0.20.x升级到0.23.4!
答案 0 :(得分:0)
您可以使用.join()
和.rename()
:
position.join(data, on=['Date','Symbol']).rename(columns={'Open': 'Open_price'})
这是一个完整的例子:
data = pd.DataFrame([['08-02-2018', 'NDA', 0.123], ['08-02-2018','DFA', 0.234],
['08-03-2018', 'NFX', 0.451], ['08-04-2018', 'BBA', 0.453]],
columns=['Date', 'Symbol', 'Open']).set_index(['Date', 'Symbol'])
position = pd.DataFrame([['08-02-2018', 'NDA'],['08-03-2018', 'NFX'],
['08-04-2018', 'TYA'],['08-04-2018', 'BBA']],
columns=['Date', 'Symbol']).set_index(['Date'])
data.index = data.index.set_levels([pd.to_datetime(data.index.levels[0]), data.index.levels[1]])
position.index = pd.to_datetime(position.index)
position = position.join(data, on=['Date','Symbol']).rename(columns={'Open': 'Open_price'})
哪个给:
数据
Open
Date Symbol
2018-08-02 NDA 0.123
DFA 0.234
2018-08-03 NFX 0.451
2018-08-04 BBA 0.453
位置
Symbol
Date
2018-08-02 NDA
2018-08-03 NFX
2018-08-04 TYA
2018-08-04 BBA
使用以上.join()
并打印position
会得出:
Symbol Open
Date
2018-08-02 NDA 0.123
2018-08-03 NFX 0.451
2018-08-04 TYA NaN
2018-08-04 BBA 0.453