Это более сложная проблема сопоставления строк, чем обычно, но вы можете использовать понимание списка для производительности:
lst = ["123 ABC", "456 DEF", "789 GHI"]
df['match'] = [any(x in l for l in lst) for x in df['idlist']]
df
id idlist match
0 0 ABC True
1 1 XYZ False
Чтобы просто отфильтровать, используйте
df[[any(x in l for l in lst) for x in df['idlist']]]
id idlist
0 0 ABC
Понимания списков - мой готовый синтаксис для многих строковых операций. Я написал подробную справку об их преимуществах в Для петель с пандами - Когда мне все равно? .
Если вам нужно обработать NaN, используйте функцию с обработкой try-catch.
def search(x, lst):
try:
return any(x in l for l in lst)
except TypeError:
return False
df[[search(x, lst) for x in df['idlist']]]
id idlist
0 0 ABC