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

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

id  keyword
1   transfer
2   atm transfer
3   atm
4   ulta transfer
5   transfer transfer

Я хочу удалить transfer слово, если не осталось ни одного слова, но если осталось только transfer слово, слово все еще осталось, другое слово - atm, но если осталось только atm и transfer, мы выбираем atm, если ключевое слово появляется несколько раз, сделайте это один раз

Вот код

df['keyword_2'] = df['keyword'].mask(df['keyword'] != 'transfer', df['keyword'].str.replace('transfer', '').str.strip())

Мой вывод

id  keyword            keyword_2
1   transfer           transfer
2   atm transfer       atm
3   atm                atm
4   ulta transfer      transfer
5   transfer transfer  

Мой ожидаемый результат

id  keyword            keyword_2
1   transfer           transfer
2   atm transfer       atm
3   atm                atm
4   ulta transfer      transfer
5   transfer transfer  transfer

Надеюсь, этот вопрос достаточно ясен

Ответы [ 4 ]

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

Таким образом, я могу представить, что слово, которое вы хотите заменить, может быть в ваших данных более двух раз, чем вы можете решить свой случай с помощью следующей функции, а затем использовать .apply, например, следующее:

Представьте, что ваши данные выглядят так:

    keyword
0   transfer
1   atm transfer
2   atm
3   ulta transfer
4   transfer transfer transfer

Как мы видим, индекс 4 содержит ваше ключевое слово 3x.

Так что нам нужно более надежное решение, подобное следующему:

# Function to remove a word
def remove_word(x, word):
    if x == word:
        return x
    elif x.count(word) > 2:
        return x.replace(word, '', x.count(word)-1)
    else: 
        return x.replace(word, '', 1)

# Apply the function
df['keyword_2'] = df.keyword.apply(lambda x: remove_word(x, 'transfer'))

Выход

    keyword                     keyword_2
0   transfer                    transfer
1   atm transfer                atm
2   atm                         atm
3   ulta transfer               ulta
4   transfer transfer transfer  transfer
0 голосов
/ 25 февраля 2019

Сравнить значения, разделенные пробелами, с наборами и установить значения на numpy.where:

mask = df['keyword'].str.split().apply(set) != set(['transfer'])
df['keyword1'] = np.where(mask, df['keyword'].str.replace('transfer', '').str.strip(), 
                                'transfer')
print (df)
   id            keyword  keyword1
0   1           transfer  transfer
1   2       atm transfer       atm
2   3                atm       atm
3   4      ulta transfer      ulta
4   5  transfer transfer  transfer
0 голосов
/ 25 февраля 2019

Использование Series.apply с лямбда-функцией:

pat = 'transfer'
df['keyword2'] = df['keyword'].apply(lambda x: x if x == pat else x.replace(pat, '', 1).strip())
0 голосов
/ 25 февраля 2019

Вы можете попробовать Series.apply :

def remove_transfer(x):
    l = x.split()
    if len(l) == 1:
        return x
    #l = [el for el in l if el != 'transfer']
    l.remove('transfer')
    return ' '.join(l)

df['keyword_2'] = df['keyword'].apply(remove_transfer)

id  keyword       keyword_2
1   transfer      transfer
2   atm transfer  atm
3   atm           atm
4   ulta transfer ulta
5   transfer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...