Вы просто хотите проверить, существует ли значение ячейки в контейнере: isin
- это путь к go. Но так как вы хотите обработать идентификатор по идентификатору, вам также понадобится groupby:
df['check'] = df.groupby(['ID', 'COL1'], group_keys=False
).apply(lambda x: x['COL1'].isin(x['COL2']))
Это дает, как и ожидалось:
ID COL1 COL2 check
0 23 AA BB True
1 23 AA AA True
2 23 AA DD True
3 23 BB BB True
4 23 BB AA True
5 23 BB DD True
6 23 CC BB False
7 23 CC AA False
8 24 AA BB False
Если вы хотите использовать строки OK / KO вместо логических значений , просто добавьте:
df['check'] = np.where(df['check'], 'OK', 'KO')