Объединить два DataFrame, имеющих заголовки разных уровней, по общему полю

Имею два массива, совпадающих по ID, но разных по набору колонок - в одном заголовки 2-х уровневые, в другом - одноуровневые.

Первый, допустим, df1 (содержит информацию о значениях profit и loss в разрезе месяцев и ID):

           profit            loss
period     2020-01  2020-02  2020-01  2020-02
ID
1          10       10       1        4
2          20       20       2        5
3          30       30       3        6
4          40       40       4        7

Второй df2 (содержит некое строковое описание конкретного ID в месяце):

period  2020-01  2020-02
ID
1       'str1'   'str1'
2       'str1'   'str1'
3       'str1'   'str2'
4       'str1'   'str2'

Надо получить res:

           profit            loss              description
period     2020-01  2020-02  2020-01  2020-02  2020-01  2020-02
ID
1          10       10       1        4        'str1'   'str1'
2          20       20       2        5        'str1'   'str1'
3          30       30       3        6        'str1'   'str2'
4          40       40       4        7        'str1'   'str2'

Делаю так:

res = df1.merge(df2, how='left', left_on='ID', right_on='ID')

Получаю предупреждение:

UserWarning: merging between different levels can give an unintended result (2 levels on the left, 1 on the right)

Задача:

в df2 добавить заголовок 1-го уровня description, чтобы обеспечить одинаковый уровень - ?


Ответы (1 шт):

Автор решения: MaxU
In [120]: df2.columns = pd.MultiIndex.from_product((['description'], df2.columns))

In [121]: df1.join(df2)
Out[121]:
    profit            loss         description
   2020-01 2020-02 2020-01 2020-02     2020-01 2020-02
ID
1       10      10       1       4      'str1'  'str1'
2       20      20       2       5      'str1'  'str1'
3       30      30       3       6      'str1'  'str2'
4       40      40       4       7      'str1'  'str2'
→ Ссылка