这是我的数据
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
希望这个问题很清楚
比较由空格分割的值与集合和设置值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
你可以尝试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
使用具有lambda函数的Series.apply
:
pat = 'transfer'
df['keyword2'] = df['keyword'].apply(lambda x: x if x == pat else x.replace(pat, '', 1).strip())
所以我可以想象你想要替换的单词在你的数据中可能超过两次,而不是你用以下函数解决你的情况,然后使用.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