【问题标题】:Pandas left merge but overwrite with right data熊猫左合并但用正确的数据覆盖
【发布时间】:2021-03-24 16:34:39
【问题描述】:

我想合并两个数据框,df2 可能有更多列,并且总是 1 行。我希望df2 行中的数据覆盖dfa 上的匹配行。

df = pd.DataFrame({'a': {0: 0, 1: 1, 2: 2}, 'b': {0: 3, 1: 4, 2: 5}})
df2 = pd.DataFrame({'a': {0: 1}, 'b': {0: 90}, 'c': {0: 76}})


>>> df
   a  b
0  0  3
1  1  4
2  2  5

>>> df2
   a  b   c
0  1  90  76

想要的输出:

   a    b   c
0  0    3   NaN
1  1    90  76 
2  2    5   NaN

我尝试过向左合并,但这会创建两个 b 列(b_xb_y):

>>> pd.merge(df,df2,how='left', on='a')
   a  b_x   b_y     c
0  0    3   NaN   NaN
1  1    4  90.0  76.0
2  2    5   NaN   NaN

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您可以在此处使用df.combine_first

    df2.set_index("a").combine_first(df.set_index("a")).reset_index()
    

    或者合并:

    out = df.merge(df2,on=['a'],how='left')
    out.loc[:,out.columns.str.endswith("_x")] = out.loc[:,
                                        out.columns.str.endswith("_y")].to_numpy()
    out = out.groupby(out.columns.str.split("_").str[0],axis=1).first()
    
    print(out)
    

       a     b     c
    0  0   3.0   NaN
    1  1  90.0  76.0
    2  2   5.0   NaN
    

    【讨论】:

    • 感谢您的回答。嗯,如果需要on=['a','x'],你会怎么做? (如果 x 是数据框中的另一列)
    • @Unfitacorn 你在这个sutation中不需要它,因为你在数据帧和pandas中都创建了'a'索引,它会自动对齐索引上的大多数操作。因此,暗含 on = 'a'。
    • @ScottBoston 我问的原因是因为a 可能并不总是唯一的,它可能是两列一起使行唯一。除非我误解了数据框索引并且可能存在重复?
    • @Unfitacorn 啊..这完全是另一回事。如果 A 重复,你想先加入 df 吗?或者您究竟想如何处理重复项?
    • @Unfitacorn 最好接受此解决方案,并使用具有预期输出的重复“a”场景创建一个新问题。
    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多