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

问题描述

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

解决方法

几乎在那里,只需将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
,

好吧,所以我假设您要基于一个特定列(同时出现在df1和df2中)的值,在df1和df2的列上扩展结果df,这将标识您要扩展的行。

因此没有合并,而是在不同的轴上级联,如下面的示例所示:

df1 = pd.DataFrame({'num_legs': [2,4,8,0],'num_wings': [2,'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,3,'num_wings2': [2,7,77,777],'num_specimen_seen2': [10,'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

编辑: 我的结果中仍然存在难解的问题。添加

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

坦白地说,这个answer更好:)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...