Поэтому у меня есть основной набор данных, который выглядит так:
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.
Я пробовал несколько разных подходов слияниями и объединениями. Меня не волнует, является ли решение сложным обходным решением, но оно не может быть переформатированием этих данных.
Выполнение двух 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
Вот воспроизводимое решение:
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