合并两个具有相同列和不同列的 Pandas DataFrame

我有两个数据帧,我想在 CCOL 列上合并:我给出了一个简短的示例,如下所示:(相同名称的 Cols 在两个数据帧中具有相同的数据)


 df1 = 


    CCOL     ColA    ColB   ColC   ColD     ColE     ColF


     A        1.0     a      b      23       45       2.7

     B        3.0     c      q      26       34       5.9

     C        5.0     f      r      2        4.9      15.9

     D        7.0     e      s      45       2         8



 df2 = 


    CCOL     ColA    ColB   ColE   ColP    ColR     ColS


      A      1.0     a       45     vq      4       21.7

      AF     7.0     za     7.9     r       4       3.1

      D      7.0     e       2      gh      3       53.1

      GK     8.0     ut     2       qt      4      33.3

所以我正在寻找的这两个数据帧的最终输出是这样的:


  final_df = 

    

    CCOL  ColA ColB ColC ColD ColE ColF ColP ColR ColS

    

     A     1.0   a    b    23   45   2.7  vq   4   21.7

     D     7.0   e    s    45   2     8   gh   3   53.1

我试过


    newdf = pd.merge(df1,df2,on='CCOL', how='inner')

但是,这个在新的 df 中从相同的列创建了 ColA_x、ColA_y 等,我不需要这些。


我的尝试:


   newdf = df1.combine_first(df2)

但是,这个创建了一个如下所示的数据框,它为具有 CCOL、“A”和“D”的行提供了正确的数据,但对于 df1 和 df2 在 CCOL 上不匹配的列则完全错误。


     newdf = 

      

      CCOL  ColA ColB ColC ColD ColE ColF ColP ColR ColS

       A    1.0    a    b   23  45.0  2.7   vq  4.0 21.7

       B    3.0    c    q   26  34.0  5.9    r  4.0 3.1

       C    5.0    f    r   2   4.9   15.9  gh  3.0 53.1

       D    7.0    e    s   45  2.0   8.0   qt  4.0 33.3

所以不明白如何实现我的输出 final_df。任何帮助将不胜感激。


小怪兽爱吃肉
浏览 190回答 2
2回答

烙印99

差不多了,只需使用how参数 as'left'并添加dropna:df1.merge(df2,how='left').dropna()输出:  CCOL  ColA ColB ColC  ColD  ColE  ColF ColP  ColR  ColS0    A   1.0    a    b    23  45.0   2.7   vq   4.0  21.73    D   7.0    e    s    45   2.0   8.0   gh   3.0  53.1

摇曳的蔷薇

好吧,我假设你想在 df1 和 df2 的列上扩展你的结果 df,基于一个特定列(存在于 df1 和 df2 中)的值,这将标识你想要扩展的行。所以没有合并,而是在不同的轴上串联,如下面的示例所示:df1 = pd.DataFrame({'num_legs': [2, 4, 8, 0],                   'num_wings': [2, 0, 0, 0],                   'num_specimen_seen': [10, 2, 1, 8]},                  index=['falcon', 'dog', 'spider', 'fish'])        num_legs  num_wings  num_specimen_seenfalcon         2          2                 10dog            4          0                  2spider         8          0                  1fish           0          0                  8df2 = pd.DataFrame({'num_legs2': [2, 4, 3, 0],                   'num_wings2': [2, 7, 77, 777],                   'num_specimen_seen2': [10, 2, 1, 8]},                  index=['falcon', 'dog', 'spider', 'fish'])        num_legs2  num_wings2  num_specimen_seen2falcon          2           2                  10dog             4           7                   2spider          3          77                   1fish            0         777                   8newdf = pd.concat([df1.num_legs.loc[df1.num_legs == df2.num_legs2],                   df1.num_wings, df2.num_wings2],                   axis=1)print(newdf)        num_legs  num_wings  num_wings2falcon       2.0          2           2dog          4.0          0           7fish         0.0          0         777spider       NaN          0          77排除一行,其中 num_legs != num_legs2。我想连接的其余列在连接方法中提供我的结果中仍然有 nans。添加这个newdf = newdf[newdf2['num_legs'].notna()]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python