Небольшая проблема с объединением / объединением фреймов данных с одинаковыми именами столбцов

1

Поэтому у меня есть основной набор данных, который выглядит так:

value_num   code    value_letter
       1    CDX     A
       2    DEF     B
       3    RPQ     C
       4    EEE     D
       5    FFX     E
       6    TRE     F

И еще две таблицы, которые мы будем называть map1 и map2

song    album_code  song_code
Song1   CDX         GIB
Song2   DEF         FRE
Song3   RPQ         SSS

song    album_code  song_code
Song4   REA         EEE
Song5   VEY         FFX
Song6   LFM         TRE

Я хочу присоединиться к основной таблице с map1, где album_code присоединен к коду. Затем я хочу присоединиться к map2 в этой новой таблице, где song_code присоединяется к коду.

В идеале конечный результат выглядит следующим образом:

value_num   code    value_letter    song    album_code  song_code
1           CDX     A               Song1          CDX  GIB
2           DEF     B               Song2          DEF  FRE
3           RPQ     C               Song3          RPQ  SSS
4           EEE     D               Song4          REA  EEE
5           FFX     E               Song5          VEY  FFX
6           TRE     F               Song6          LFM  TRE

Вместо этого на выходе есть 9 имен столбцов: value_num, code, value_letter, song_x, album_code_x, song_code_x, song_y, album_code_y и song_code_y. Значения из map1 находятся под столбцами x, а значения song2 находятся под y.

Я пробовал несколько разных подходов слияниями и объединениями. Меня не волнует, является ли решение сложным обходным решением, но оно не может быть переформатированием этих данных.

Теги:
pandas
dataframe
join
merge

2 ответа

1

Выполнение двух merge с comb_first

r1=df.merge(df1,left_on='code',right_on='album_code',how='left')
r2=df.merge(df2,left_on='code',right_on='song_code',how='left')   
r1.combine_first(r2)
Out[547]: 
   value_num code value_letter   song album_code song_code
0          1  CDX            A  Song1        CDX       GIB
1          2  DEF            B  Song2        DEF       FRE
2          3  RPQ            C  Song3        RPQ       SSS
3          4  EEE            D  Song4        REA       EEE
4          5  FFX            E  Song5        VEY       FFX
5          6  TRE            F  Song6        LFM       TRE
  • 0
    Проблема этого и другого решения заключается в том, что если в основной таблице есть код, которого нет в двух других таблицах, эта строка будет удалена в конечном результате. Это должно остаться.
0

Вот воспроизводимое решение:

import pandas as pd

cols = ['value_num',   'code',    'value_letter']
data = [(1,    'CDX',     'A'),
        (2,    'DEF',     'B'),
        (3,    'RPQ',     'C'),
        (4,    'EEE',     'D'),
        (5,    'FFX',     'E'),
        (6,    'REM',     'F'),
        (7,    'TRE',     'G')]
main_df = pd.DataFrame.from_records(data, columns=cols)
ind_df = pd.DataFrame(index=main_df['code'])

cols = ['song',    'album_code',  'song_code']
data = [('Song1',   'CDX',         'GIB'),
        ('Song2',   'DEF',         'FRE'),
        ('Song3',   'RPQ',         'SSS')]
map1 = pd.DataFrame.from_records(data, columns=cols)

cols = ['song',    'album_code',  'song_code']
data = [('Song4',   'REA',         'EEE'),
        ('Song5',   'VEY',         'FFX'),
        ('Song6',   'LFM',         'TRE')]
map2 = pd.DataFrame.from_records(data, columns=cols)


merged_map1 = main_df.merge(map1, left_on='code', right_on='album_code')
merged_map2 = main_df.merge(map2, left_on='code', right_on='song_code')
merged_maps = merged_map1.append(merged_map2)

map_all = ind_df.merge(merged_maps, left_index=True, right_on=['code'], how='left')

print(map_all)

Конечный результат:

   value_num code value_letter   song album_code song_code
0        1.0  CDX            A  Song1        CDX       GIB
1        2.0  DEF            B  Song2        DEF       FRE
2        3.0  RPQ            C  Song3        RPQ       SSS
0        4.0  EEE            D  Song4        REA       EEE
1        5.0  FFX            E  Song5        VEY       FFX
2        NaN  REM          NaN    NaN        NaN       NaN
2        7.0  TRE            G  Song6        LFM       TRE
  • 0
    Проблема этого и другого решения заключается в том, что если в основной таблице есть код, которого нет в двух других таблицах, эта строка будет удалена в конечном результате. Это должно остаться.
  • 0
    @JesusMonroe. Я обновил решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню