Объединение панелей данных панд на основе индекса и даты - PullRequest
0 голосов
/ 02 декабря 2018

Я хотел бы объединить / объединить / ... 2 кадра данных так, чтобы я получил 3-й кадр данных ниже (это 1-й кадр данных + var2 из 2-го кадра данных для каждой комбинации тикера / даты из 1-го):

1-й кадр данных:

 dict1 = [{'date': '2016-11-29','var1': 'x1'},
 { 'date': '2016-11-29','var1': 'x2'},
 { 'date': '2016-11-29','var1': 'x3'},
 {'date': '2016-11-29','var1': 'x4'},
 {'date': '2016-11-30','var1': 'x5'},
 {'date': '2016-11-30','var1': 'x6'}]
 df1 = pd.DataFrame(dict1, index=['ge','jpm','fb', 'msft','ge','jpm'])

2-й кадр данных:

 dict2 = [{'date': '2016-11-29','var2': 'y1'},
 { 'date': '2016-11-29','var2': 'y2'},
 { 'date': '2016-11-29','var2': 'y3'},
 {'date': '2016-11-29','var2': 'y4'},
 {'date': '2016-11-30','var2': 'y5'},
 {'date': '2016-11-30','var2': 'y6'},
 {'date': '2016-11-30','var2': 'y7'},
 {'date': '2016-11-30','var2': 'y8'}]
  df2 = pd.DataFrame(dict2, index=['aapl', 'msft','ge','jpm','aapl', 'msft','ge','jpm'])

3-й (целевой) кадр данных:

  dict3 = [{'date': '2016-11-29','var1': 'x1','var2': 'y3'},
 { 'date': '2016-11-29','var1': 'x2','var2': 'y4'},
 { 'date': '2016-11-29','var1': 'x3','var2': 'NaN'},
 {'date': '2016-11-29','var1': 'x4','var2': 'y2'},
 {'date': '2016-11-30','var1': 'x5','var2': 'y7'},
 {'date': '2016-11-30','var1': 'x6','var2': 'y8'}]
 df3 = pd.DataFrame(dict3, index=['ge','jpm','fb', 'msft','ge','jpm'])

Обратите внимание, что кадры данных не являютсявыровнен, поэтому объединение должно обеспечить совпадение индекса и даты.То есть индекс и дата являются уникальными идентификаторами.Например, в 3-м кадре данных вы можете видеть, что 1-й строке нужен тикер «ge» с даты «2016-11-29».Кроме того, как уже упоминалось, мне нужны только данные, которые находятся в df1, что-либо в df2, кроме того, что не интересно (т. Е. Дополнительные даты или тикеры не имеют значения).

1 Ответ

0 голосов
/ 02 декабря 2018

Вы можете сбросить индекс, объединить столбец индекса и столбец даты и восстановить индекс:

df1.reset_index().merge(df2.reset_index(), 
                        on=['index', 'date'], how='left')\
                 .set_index('index')
#             date var1 var2
#index                      
#ge     2016-11-29   x1   y3
#jpm    2016-11-29   x2   y4
#fb     2016-11-29   x3  NaN
#msft   2016-11-29   x4   y2
#ge     2016-11-30   x5   y7
#jpm    2016-11-30   x6   y8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...