如果包含子字符串,则同时替换多个字符串

时间:2018-08-19 10:56:53

标签: python python-3.x pandas

假设我要用一个名为“亚美尼亚语”的字符串同时替换包含“ arm”,“ hay”和“ Arm”字符的整个字符串。 (例如:亚美尼亚->亚美尼亚,海耶伦->亚美尼亚等)

这就是我累了

> df[col] = df[col].apply(lambda x : 'Armenian' if ["Arm","hay","arm",] in x else x)

我得到

  

TypeError:“ in”要求将字符串作为左操作数,而不是列表>

4 个答案:

答案 0 :(得分:3)

您可以使用:

df.loc[df['col'].str.contains('(?i)hay|arm'), 'col'] = 'Armenian'

这将检查列中是否在任何地方都不区分大小写包含“ hay”或“ arm”,并返回一个布尔数组,该布尔数组用于从原始数据帧中过滤行,并将其分配给找到匹配项的“亚美尼亚”列。

答案 1 :(得分:2)

@Ignore

这可以完成工作

答案 2 :(得分:0)

str对象仅对字符串支持in操作符。例如。

>>> 'arm' in 'I broke my arm'
True

因此,当您尝试将其与list

一起使用时会出现错误
>>> ['Arm', 'arm'] in 'I broke my arm'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not list

如果要查看字符串是否在列表中包含任何术语,建议您使用re模块,以构建正则表达式并将其与字符串匹配:

>>> import re
>>> regex = re.compile('|'.join('(%s)' % term for term in terms))
>>> regex.search('I broke my arm')
<_sre.SRE_Match object; span=(11, 14), match='arm'>

您可以从中构建一个函数

>>> def replace_from_list(terms, substitute, flags=0):
...     regex = re.compile('|'.join('(%s)' % term for term in terms))
...     def inner_replace(s):
...         return substitute if regex.search(s, flags) else s
...     return inner_replace
... 
>>> f = replace_from_list(['arm', 'hay'], 'Armenian', re.IGNORECASE)
>>> f('I broke my arm')
'Armenian'
>>> f('I broke my leg')
'I broke my leg'
>>> 

请注意,我不认识Pandas,但似乎它有某种功能可以完全满足您的需求。请参阅JonClements答案。

答案 3 :(得分:-1)

我尝试过:

df['col'] = list(map(lambda x : 'Armenian' if any(item in x for item in ["Arm","hay","arm"]) else x, df['col']))