Pandas запрашивает мультииндексный фрейм данных на основе другого отдельного индексного фрейма данных - PullRequest
0 голосов
/ 24 августа 2018

У меня есть два кадра данных: Данные & Позиции .

Данные имеют мультииндекс: «Дата» и «Символ». Позиции имеет один индекс: «Дата» (и имеет столбец с меткой «Символ»).Оба 'Date' -ы являются DatetimeIndexes.

Я хочу получить значение 'Open' из Данные до Позиции для всех дат (индексов) в Positions .

Если я попытаюсь сделать следующее:

positions['Open_price'] = data.loc['1997-02-10','AA'].Open

Я правильно получу значение «Open» для символа «AA» на 1997-02-10 для «Поле Open_price 'для всего Positions кадра данных.Однако моя цель - получить Open_price для соответствующей даты (индекс) и символа (значение столбца).

Поэтому я пытаюсь это сделать:

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]"

ПРИМЕЧАНИЕ. Важно, чтобы в индексе Data *1035* 'Date' отсутствовали значения (выходные дни). Позиции В индексе «Дата» нет пропущенных дат.

Как мне сделать эту работу?

ВАЖНО:

Принятый ответ работает, но мне нужнообновить версию панда 0.20.x до 0.23.4!

1 Ответ

0 голосов
/ 24 августа 2018

Вы можете использовать .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
...