所以我有一组主要数据,如下所示:
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下。
我尝试了几种不同的合并和联接方法。我不在乎该解决方案是否是一个复杂的解决方法,但不能将其重新格式化。
答案 0 :(得分:1)
使用Combine_first做两个merge
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
答案 1 :(得分: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