df = pd.DataFrame({
'Name': ['James', 'Harry', 'Anakin', 'Luke'],
'Lastname': ['Potter', 'Potter', 'Skywalker', 'Skywalker'],
'House ID': ['12345', np.nan, np.nan, np.nan]
})
lookup_table = df[df['House ID'].notnull()][['Lastname', 'House ID']].drop_duplicates()
similar_addresses = (
df[['Lastname', 'House ID']]
.merge(lookup_table, how='left', on='Lastname', suffixes=['', '_same_last_name'])
['House ID_same_last_name']
)
df['House ID'] = df['House ID'].combine_first(similar_addresses)
>>> df
Name Lastname House ID
0 James Potter 12345
1 Harry Potter 12345
2 Anakin Skywalker NaN
3 Luke Skywalker NaN