Как выбрать и заменить ключевое слово в столбце панд строки? - PullRequest
0 голосов
/ 25 февраля 2019

Вот мои данные

Id  Keyword
1   ayam e-commerce
2   biaya fuel personal wallet
3   pulsa sms virtualaccount
4   biaya koperasi personal
5   familymart personal
6   e-commerce pln
7   biaya onus
8   koperasi personal
9   biaya familymart personal
10  fuel personal wallet
11  fuel travel

Что я хочу, чтобы каждое ключевое слово, которое существует, например, fuel, pln и ayam, сокращалось до fuel, pln илиayam, поэтому вывод будет таким:

Id  Keyword
1   ayam
2   biaya fuel personal wallet
3   pulsa sms virtualaccount
4   biaya koperasi personal
5   familymart personal
6   pln
7   biaya onus
8   koperasi personal
9   biaya familymart personal
10  fuel
11  fuel

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 февраля 2019

Для замены только первого подходящего слова используйте 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
...