假设我要用一个名为“亚美尼亚语”的字符串同时替换包含“ arm”,“ hay”和“ Arm”字符的整个字符串。 (例如:亚美尼亚->亚美尼亚,海耶伦->亚美尼亚等)
这就是我累了
> df[col] = df[col].apply(lambda x : 'Armenian' if ["Arm","hay","arm",] in x else x)
我得到
TypeError:“ in”要求将字符串作为左操作数,而不是列表>
答案 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']))