【问题标题】:Subtle issue with joining/merging dataframes with the same column names加入/合并具有相同列名的数据框的微妙问题
【发布时间】:2018-07-27 03:16:04
【问题描述】:

所以我的主要数据集如下所示:

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 列下。

我尝试了几种不同的合并和连接方法。我不在乎解决方案是否是一个复杂的解决方法,但它不能重新格式化这些数据。

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案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
    

    【讨论】:

    • 这个解决方案和另一个解决方案的问题是,如果主表的代码不在其他两个表中,则该行将在最终结果中被删除。它应该留下来。
    【解决方案2】:

    这是一个可重现的解决方案:

    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
    

    【讨论】:

    • 这个解决方案和另一个解决方案的问题是,如果主表的代码不在其他两个表中,则该行将在最终结果中被删除。它应该留下来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2020-04-13
    • 2021-05-12
    • 2022-08-19
    相关资源
    最近更新 更多