Используйте merge
с внешним объединением по первым 2 столбцам, а затем отфильтруйте те же строки, а также строки с ошибочными значениями по DataFrame.dropna
:
df = df2.merge(df1, how='outer', on=['Sector','Plot'], suffixes=('_new','_prev'))
df = df[df['Status_new'].ne(df['Status_prev'])].dropna(subset=['Status_new','Status_prev'])
print (df)
Sector Plot Status_new Status_prev
0 SE1 1 Constructed UnderConstruction
2 SE1 3 Developed UnderConstruction
4 SE2 2 Developed Constructed
Вы можете создать функцию как:
def compare(df1, df2, on, comp):
df = df2.merge(df1, how='outer', on=on, suffixes=('_new','_prev'))
return (df[df[f'{comp}_new'].ne(df[f'{comp}_prev'])]
.dropna(subset=[f'{comp}_new',f'{comp}_prev']))
df = compare(df1, df2, ['Sector','Plot'], 'Status')