'Merge with replacement of smaller dataframe to larger dataframe

I have two DataFrames that look like this:

DF1:

index  colA colB
 id1    0     0
 id2    0     0
 id3    0     0
 id4    0     0
 id5    0     0

DF2:

index  colA   colB
  id3    A3     B3
  id4    A4     B4
  id6    A6     B6

I want to infuse values from DF2 to DF1. I was trying to merge but it does not replace the values and creates newer columns. The resulting DataFrame I want should look like this:

DF1:

index  colA  colB
  id1     0     0
  id2     0     0
  id3    A3    B3
  id4    A4    B4
  id5     0     0
  id6    A6    B6

Note: it should create a new index in DF1 if DF2 has some index not present in DF1. Also columns index are the index of DataFrames and not column names.



Solution 1:[1]

Here's one way using concat + drop_duplicates:

out = pd.concat((df1, df2)).reset_index().drop_duplicates(subset=['index'], keep='last').set_index('index').sort_index()

or use reindex + update:

df1 = df1.reindex(df1.index.union(df2.index))
df1.update(df2)

Output:

  index colA colB
0   id1    0    0
1   id2    0    0
0   id3   A3   B3
1   id4   A4   B4
4   id5    0    0
2   id6   A6   B6

Solution 2:[2]

You can try with combine_first

df1 = df1.set_index('index')
df2 = df2.set_index('index')
out = df2.combine_first(df1)
Out[217]: 
      colA colB
index          
id1    0.0  0.0
id2    0.0  0.0
id3     A3   B3
id4     A4   B4
id5    0.0  0.0
id6     A6   B6

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 BENY