Для замены только первого подходящего слова используйте contains
в цикле:
L = ['fuel', 'pln', 'ayam']
for x in L:
df.loc[df['Keyword'].str.contains(x), 'Keyword'] = x
Или понимание вложенного списка:
L = ['fuel', 'pln', 'ayam']
df['Keyword'] = [next(iter([z for z in L if z in x]), x) for x in df['Keyword']]
Или extract
с fillna
для замены отсутствующих значений на исходные значения:
L = ['fuel', 'pln', 'ayam']
pat = '|'.join(r"\b{}\b".format(x) for x in L)
df['Keyword'] = df['Keyword'].str.extract('('+ pat + ')', expand=False).fillna(df['Keyword'])
print (df)
Id Keyword
0 1 ayam
1 2 fuel
2 3 pulsa sms virtualaccount
3 4 biaya koperasi personal
4 5 familymart personal
5 6 pln
6 7 biaya onus
7 8 koperasi personal
8 9 biaya familymart personal
9 10 fuel
10 11 fuel
При необходимости все совпадающие значения используют findall
с join
и заменить непустые значения на исходные на loc
:
print (df)
Id Keyword
0 1 ayam e-commerce
1 2 biaya fuel pln wallet <- matched 2 keywords
2 3 pulsa sms virtualaccount
pat = '|'.join(r"\b{}\b".format(x) for x in L)
s = df['Keyword'].str.findall('('+ pat + ')').str.join(', ')
df.loc[s != '', 'Keyword'] = s
print (df)
Id Keyword
0 1 ayam
1 2 fuel, pln
2 3 pulsa sms virtualaccount