通过覆盖合并具有相同列的两个数据框

时间:2019-07-30 12:54:10

标签: python pandas dataframe merge

我有这样的数据框:

    df = pd.DataFrame({"flag":["1","0","1","0"], 
     "val":["111","111","222","222"], "qwe":["","11","","12"]})

它给出:

   flag qwe val
0    1      111
1    0  11  111
2    1      222
3    0  12  222

然后我正在像这样过滤第一个数据帧:

    dff = df.loc[df["flag"]=="1"]
    **was:**
    dff.loc["qwe"] = "123"
    **edited:** (setting all rows in column "qwe" to "123")
    dff["qwe"] = "123" 

现在我需要以以下方式合并/加入df和dff:

   flag qwe val
0    1  123 111
1    0  11  111
2    1  123 222
3    0  12  222

仅当df值为空时,才从dff添加'qwe'更改。

类似这样的东西:

pd.merge(df, dff, left_index=True, right_index=True, how="left")

给予

    flag_x qwe_x val_x flag_y qwe_y val_y
0      1         111      1         111
1      0    11   111    NaN   NaN   NaN
2      1         222      1         222
3      0    12   222    NaN   NaN   NaN

因此,在那之后,我需要删除flag_y,val_y,重命名_x列并手动合并qwe_x和qwe_y。但是有什么方法可以使它更容易吗?

2 个答案:

答案 0 :(得分:2)

pd.merge有一个on参数,可用于在不同数据框中联接具有相同名称的列。

尝试:

pd.merge(df, dff, how="left", on=['flag', 'qwe', 'val'])

但是,我认为您根本不需要这样做。您可以使用df.loc来有条件地分配一个值,从而产生相同的结果:

df.loc[(df["flag"] == "1") & (df['qwe'].isnull()), 'qwe'] = 123

答案 1 :(得分:0)

在完成更改后,对我来说,此代码有效:

c1 = dff.combine_first(df)

它产生:

   flag  qwe val
0    1  123  111
1    0   11  111
2    1  123  222
3    0   12  222

我到底在找谁。