Pandas захват и объединение данных из n-фреймов данных в один фрейм данных - PullRequest
0 голосов
/ 05 февраля 2020

Я уже посмотрел еще один аналогичный вопрос и ответ по этому вопросу, но не могу понять свою проблему, поэтому я благодарен за любую подсказку. У меня есть три фрейма данных, которые хранятся в диктонарном, и другой фрейм данных, когда я хочу собрать данные.

import numpy as np
import pandas as pd

df1= pd.DataFrame({'tenor':['1w', '1m', '3m', '2y'],
                   'rate':[2.40, 2.51, 2.66, 2.92],
                   'end_date':['14022020', '09022020', '07052020', '07022022']})

df2= pd.DataFrame({'tenor':['3x6', '6x9', '9x12'],
                   'rate':[2.95, 3.06, 3.98],
                   'end_date':['07082020', '09112020', '08022021']})

df3= pd.DataFrame({'tenor':['2y', '3y', '4y'],
                   'rate':[1.80, 1.81, 1.84],
                   'end_date':['08022022', '07022023', '07022024']})


rates = {'ois':df1, 'fra':df2, 'irs':df3}


dfA= pd.DataFrame({'label':['ois', 'ois', 'fra', 'fra', 'irs', 'irs', 'irs'],
                   'tenor':['1w', '1m', '3x6', '9x12', '2y', '3y', '4y']})

Я хотел бы добавить еще один столбец ['rate'] в dfA, выбирая значения из базового ответа кадры данных (с помощью точного отображения), которые соответствуют ['тенор']. Таким образом, ожидаемый результат будет следующим:

Out[]: 
  label tenor  rate
0   ois    1w  2.40
1   ois    1m  2.51
2   fra   3x6  2.95
3   fra  9x12  3.98
4   irs    2y  1.80
5   irs    3y  1.81
6   irs    4y  1.84

Я знаю, что могу получить конкретные данные в кадре данных с помощью этой строки (например):

rates['ois'].loc[rates['ois']['tenor']=='1w', 'rate']
Out[]: 
0    2.4
Name: rate, dtype: float64

Поэтому я пытаюсь встраивать это в apply () функцию со следующим кодом:

dfA['rate'] = dfA.apply(lambda x: rates[x['label']][rates[x['label']]['tenor']==x['tenor']]['rate'], axis=1)

Но, к сожалению, он возвращает:

Out[]: 
  label tenor  rate
0   ois    1w  2.40
1   ois    1m   NaN
2   fra   3x6  2.95
3   fra  9x12   NaN
4   irs    2y  1.80
5   irs    3y   NaN
6   irs    4y   NaN

Я не понимаю, почему некоторые показатели равны NaN. Что мне здесь не хватает? Пожалуйста, помогите.

1 Ответ

2 голосов
/ 05 февраля 2020

Я не знаю, является ли это подходящим решением для вас, но я бы сделал так: dfAux = pd.concat([df1, df2, df3])

Выполнить слияние, используя dfA слева:

dfA = pd.merge(dfA, dfAux, how = 'left', on = ['tenor']).drop(['end_date'], axis = 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...