为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小怪兽爱吃肉 2023-05-16 14:47:57
我有两个数据帧,我想在 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。任何帮助将不胜感激。
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

差不多了,只需使用how参数 as'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


查看完整回答
反对 回复 2023-05-16
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

好吧,我假设你想在 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。我想连接的其余列在连接方法中提供

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

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


查看完整回答
反对 回复 2023-05-16
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信