如何删除某些单词只有在没有删除关键字重复的情况下才是附加关键字

问题描述 投票:2回答:4

这是我的数据

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

我想删除transfer字,如果没有剩下一个字,但如果只剩下transfer字,那个字仍然保留,其他字是atm,但如果只剩下atmtransfer,我们选择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

希望这个问题很清楚

pandas dataframe
4个回答
2
投票

比较由空格分割的值与集合和设置值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

2
投票

你可以尝试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

2
投票

使用具有lambda函数的Series.apply

pat = 'transfer'
df['keyword2'] = df['keyword'].apply(lambda x: x if x == pat else x.replace(pat, '', 1).strip())

1
投票

所以我可以想象你想要替换的单词在你的数据中可能超过两次,而不是你用以下函数解决你的情况,然后使用.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
© www.soinside.com 2019 - 2024. All rights reserved.