Я бы сначала вычислил дополнительный логический столбец, а затем использовал бы групповое агрегирование:
resul = df.assign(FinalStatus = ((df['STATUS1'].str.lower() == 'ok') &
(df['STATUS2'].str.lower() == 'ok'))
).groupby('ID').agg({'STATUS1': 'first',
'STATUS2': 'first',
'FinalStatus': all}).reset_index()
Добавьте правильные метки в последний столбец, и все:
resul['FinalStatus'] = np.where(resul['FinalStatus'], 'OK', 'KO')
дает:
ID STATUS1 STATUS2 FinalStatus
0 12 OK OK KO
1 13 OK OK OK