Объединение Pandas фреймов данных в значениях столбцов MultiIndex - PullRequest
1 голос
/ 03 марта 2020

У меня есть два многоуровневых столбца данных.

import pandas as pd
df1 = pd.DataFrame({'col1':[1,1,2,2],'col2':[10,10,20,20]})
df1.columns = pd.MultiIndex.from_product([['df1_labels'],df1.columns])
df1

 df1_labels
   col1 col2
0   1   10
1   1   10
2   2   20
3   2   20

df2 = pd.DataFrame({'col3':[100,200],'col4':[10,20]})
df2.columns = pd.MultiIndex.from_product([['df2_labels'],df2.columns])
df2

   df2_labels
   col3  col4
0   100  10
1   200  20

Я хотел бы объединить их со значениями в столбце 'df1_labels', 'col2' в df1 и столбце 'df2_labels', 'col2' в df2. Мой ожидаемый результат будет:

  df1_labels  df2_labels
  col1  col2  col3  col4
0   1   10    100    10
1   1   10    100    10
2   2   20    200    20
3   2   20    200    20

Я пробовал это:

df3 = pd.merge(df1,df2, left_on=('df1_labels','col2'), right_on=('df2_labels','col4'))
df3

И это:

df3 = pd.merge(df1,df2, left_on=['df1_labels','col2'], right_on=['df2_labels','col4'])
df3

Оба дают мне следующую ошибку:

ValueError: Метка столбца 'df2_labels' не уникальна. Для многоиндексных метка должна быть кортежем с элементами, соответствующими каждому уровню.

Я должен делать синтаксические ошибки. С уровнями одного столбца это работает:

pd.merge(pd.DataFrame({'col1':[1,1,2,2],'col2':[10,10,20,20]}),
         pd.DataFrame({'col3':[100,200],'col4':[10,20]}), 
         left_on='col2',right_on='col4')

 col1 col2 col3 col4
0   1   10  100 10
1   1   10  100 10
2   2   20  200 20
3   2   20  200 20

Любая помощь будет приветствоваться!

1 Ответ

1 голос
/ 03 марта 2020

Для меня работает добавить [] для tuples:

df = pd.merge(df1,df2, left_on=[('df1_labels','col2')], right_on=[('df2_labels','col4')])
print (df)
  df1_labels      df2_labels     
        col1 col2       col3 col4
0          1   10        100   10
1          1   10        100   10
2          2   20        200   20
3          2   20        200   20
...