Use DataFrame.combine_first by name columns converted to index in both DataFrames:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df2.combine_first(df1).reset_index()
print (df1)
name address age
0 Jack addr1 10.0
1 Lucy NaN 2.0
2 Mark addr2 11.0
First original solution should be changed:
df1 = df1.set_index('name')
df2 = df2.set_index('name')
df1 = df1.reindex(df1.columns.union(df2.columns, sort=False), axis=1)
df1.update(df2)
df1 = df1.reset_index()
print (df1)
name age address
0 Jack 10.0 addr1
1 Lucy 2.0 NaN
2 Mark 11.0 addr2
Or solution with left join in DataFrame.merge and DataFrame.combine_first:
#left join df2, if existing columns name is added _ to end
df = df1.merge(df2, on='name', how='left', suffixes=('','_'))
#filter columns names
new_cols = df.columns[df.columns.str.endswith('_')]
#remove last char from column names
orig_cols = new_cols.str[:-1]
#dictionary for rename
d = dict(zip(new_cols, orig_cols))
#filter columns and replace NaNs by new appended columns
df[orig_cols] = df[new_cols].rename(columns=d).combine_first(df[orig_cols])
#remove appended columns
df = df.drop(new_cols, axis=1)
print (df)
name age address
0 Jack 10.0 addr1
1 Lucy 2.0 NaN
2 Mark 11.0 addr2