【问题标题】:Merging two Pandas DataFrames with identical columns as well as different ones [closed]合并具有相同列和不同列的两个 Pandas DataFrame [关闭]
【发布时间】:2020-08-12 18:34:20
【问题描述】:

我有两个要在 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。任何帮助将不胜感激。

【问题讨论】:

  • 使用df1.merge(df2, on=['CCOL', 'ColA', 'ColB', 'ColE'])
  • 这能回答你的问题吗? Pandas Merging 101
  • 有点不清楚。它创建 'ColA_x''ColA_y' 的原因是因为没有它们是合并键,就不能保证它们是相同的(因此你需要单独的值)。但是,如果它们在之前的操作中可能被设计为始终应该是相同的,那么您实际上只需执行 df1.merge(df2) 即可获得所需的输出
  • 这些都不能让我只得到带有 A & D 和所有列的 CCOl 行
  • @Stan 如果这些都不起作用,那么您需要提供实际代表您的问题的数据。如果你需要正确的答案。同样以您的示例为例,我的第一个评论答案和 ALollz 建议都有效。

标签: python pandas dataframe join merge


【解决方案1】:

差不多了,只需使用how 参数作为'left' 并添加dropna

df1.merge(df2,how='left').dropna()

输出:

  CCOL  ColA ColB ColC  ColD  ColE  ColF ColP  ColR  ColS
0    A   1.0    a    b    23  45.0   2.7   vq   4.0  21.7
3    D   7.0    e    s    45   2.0   8.0   gh   3.0  53.1

【讨论】:

    【解决方案2】:

    好的,所以我假设您想在 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_seen
    falcon         2          2                 10
    dog            4          0                  2
    spider         8          0                  1
    fish           0          0                  8
    
    df2 = 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_seen2
    falcon          2           2                  10
    dog             4           7                   2
    spider          3          77                   1
    fish            0         777                   8
    
    newdf = 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_wings2
    falcon       2.0          2           2
    dog          4.0          0           7
    fish         0.0          0         777
    spider       NaN          0          77
    
    

    排除一行,其中 num_legs != num_legs2。我想连接的其余列在 concat 方法中提供

    详情请看link

    编辑: 我的结果中仍然有 nans。添加这个

    newdf = newdf[newdf2['num_legs'].notna()]
    

    这个answer老实说要好得多:)

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 2014-01-18
      • 2017-09-02
      • 2020-01-02
      • 2020-11-17
      • 2021-02-24
      • 2022-10-18
      • 2020-06-13
      • 2019-10-22
      相关资源
      最近更新 更多