Присоединение или объединение фреймов данных с разными мультииндексами - PullRequest
1 голос
/ 10 июля 2020

Заранее приносим свои извинения за повторяющийся вопрос, но мне еще предстоит найти решение, которое работает с предыдущими вопросами.

Я не могу объединить два фрейма данных с разными MultiIndexes. Я хочу сохранить все столбцы из обоих фреймов данных.

Учитывая, что df1 имеет ~ 300 тыс. Строк, а df2 ~ 50 тыс. Строк, соединения будет много: 1 между df1: df2.

df1                  B  path_id
cust_id date                   
11      2015-02-24  10       13
28      2015-02-25  16       22
23      2015-02-26  21       19
15      2015-02-27  11       28
18      2015-02-28  29       10


df2               C
cust_id path_id    
11      13       10
28      22       26
23      19       22
15      28       27
18      10       18

Цель состоит в том, чтобы назначить столбец C всем подходящим комбинациям индекса cust_id и столбца path_id. См. Пример df3 ниже.

df3                     B   C  path_id
cust_id date                       
11      2015-02-24  10  10       13
28      2015-02-25  16  26       22
23      2015-02-26  21  22       19
15      2015-02-27  11  27       28
18      2015-02-28  29  18       10

Оцените любой ответ по этому поводу. Спасибо!

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Ну я разобрался. Я не уверен, что это лучший способ, но я просто сбрасываю индексы обоих фреймов данных и объединяю их по столбцам. См. Код ниже.

df1.reset_index()
df2.reset_index()
df3 = df1.merge(df2, on=['cust_id', 'path_id'])

Затем я переназначил индексы. Если есть лучший способ, дайте мне знать.

Спасибо!

0 голосов
/ 10 июля 2020

Исходя из того, что я понял из вашего вопроса, это два варианта, которые могут вам помочь.

  1. Следующий код выполнит полное (внутреннее) слияние на основе двух индексов, т.е. : cust_id и path_id и сохранит остальные данные в виде столбцов фрейма данных.
df3 = pd.merge(df1, df2,on=["cust_id", "path_id"])
Следующий код выполнит вышеуказанное, а также сделает столбец (cust_id) индексом для нового фрейма данных.
df3 = pd.merge(df1, df2,on=["cust_id", "path_id"]).set_index('cust_id')
0 голосов
/ 10 июля 2020

Попробуйте:

df1.reset_index('date').merge(df2, on=['cust_id','path_id'])

Вывод:

               date   b  path_id   c
cust_id                             
11       2015-02-24  10       13  10
28       2015-02-25  16       22  26
23       2015-02-26  21       19  22
15       2015-02-27  11       28  27
18       2015-02-28  29       10  18
...