合并具有相同列和不同列的两个数据帧

2024-05-16 03:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,我想在列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

因此,我不知道如何实现我的最终输出。任何帮助都将不胜感激


Tags: 数据ghdf1df2colscolpcoldcole
2条回答

在这里,只需使用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, 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的其余列是在concat方法中提供的

详情请参阅此link

编辑: 我的成绩中仍有不好的地方。加上这个

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

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

相关问题 更多 >