Неожиданная ошибка ключевого слова при объединении двух мультииндексных фреймов данных в Pandas - PullRequest
0 голосов
/ 31 мая 2019

У меня есть два мультииндексных фрейма данных, которые я хочу объединить в общий столбец на втором уровне. Попытка внешнего слияния двух dfs возвращает неожиданный KeyError в окончательном ключе слияния.

Я проверил слияние без мультииндекса, и оно отлично работает. Я также изменил порядок слияния, и это, кажется, всегда происходит в параметре right_on. Наконец, я подтвердил, что могу получить доступ к ошибочному ряду ключей вне слияния.

слияние с одним индексом работает нормально:

[IN]:
df1 = pd.DataFrame({'A1': ['A1', 'A1', 'A2', 'A3'],
                    'B': ['121', '345', '123', '146'],
                    'C': ['K0', 'K1', 'K0', 'K1']})

df2 = pd.DataFrame({'A2': ['A1', 'A3'],
                    'X': ['B0', 'B3'],
                    'Y': ['121', '345'],
                    'Z': ['D0', 'D1']})

fine_merge = pd.merge(df1,df2,how='outer',left_on='A1', right_on='A2')
print(fine_merge)
[OUT]:
  A1    B   C   A2    X    Y    Z
0  A1  121  K0   A1   B0  121   D0
1  A1  345  K1   A1   B0  121   D0
2  A2  123  K0  NaN  NaN  NaN  NaN
3  A3  146  K1   A3   B3  345   D1

Многоиндексный ключ работает отлично:

[IN]:
df1.columns = pd.MultiIndex.from_tuples([('left_header', c) for c in df1.columns])
df2.columns = pd.MultiIndex.from_tuples([('right_header', c) for c in df2.columns])

print(df2['right_header','A2'])
[OUT]:
0    A1
1    A3
Name: (right_header, A2), dtype: object

но слияние нескольких индексов возвращает KeyError

[IN]:
error_merge = pd.merge(df1,df2, how='outer', left_on=['left_header','A1'], right_on=('right_header','A2'))
print(error_merge)
[OUT]:
KeyError: 'A2'

Меня это довольно смущает, особенно если учесть, что, если я отменю слияние или что-то такое, что df1 является правильным, а right_on==['left_header','A1'], то полученная ошибка будет KeyError: 'A1'

Заранее спасибо за помощь.

edit: объединить, объединить, concat all и получить следующий результат:


combined
  left_header          right_header                 
       A1    B   C       A2    X      Y    Z
0      A1  121  K0       A1   B0  121.0   D0
1      A1  345  K1       A3   B3  345.0   D1
2      A2  123  K0      NaN  NaN    NaN  NaN
3      A3  146  K1      NaN  NaN    NaN  NaN

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете попробовать следующие решения:

  1. Использование combine.first

    df1.combine_first(df2)

  2. Использование Concat:

    pd.concat([df1, df2], axis=1)

  3. Простой Join:

    df1.join(df2, how='outer')

...