我有一个包含一些字符串的pandas列。我想将相似的字符串分组,并用它们的类别替换它们。在我的真实例子中,我有6个不同的字符串,我想将它们替换为3个不同的类别字符串。
我发现这个答案是如何使用replace()函数将多个值映射为1的,所以我尝试扩展一些答案,以进行多组的多对一映射,但并不是所有的值都被正确更改,我不确定为什么。
例如:
df1 = pd.DataFrame({'col1':['foo', 'foo too', 'bar', 'BAR', 'bar ii']})
col1
0 foo
1 foo too
2 bar
3 BAR
4 bar ii
从其中一个答案中,看起来如果使用正则表达式,你可以使用'|'来分隔不同的键选项,所以我像下面这样做:
df1['col1'].replace({'foo|foo too' : 'Foo',
'bar|BAR|bar ii' : 'Bar'}, regex=True)
这转换了我的大部分字符串,但不是全部:
col1
0 Foo
1 Foo too
2 Bar
3 Bar
4 Bar ii
从这个例子中,我猜测可能与空格有关?尽管在我的实际例子中,一些有空格的字符串确实被正确替换了,所以我不确定。如果有人能帮忙解释为什么这不起作用/我如何实现我想要的,我将不胜感激。
您需要精心设计您的正则表达式,以确保在较长字符串之前不出现另一个模式的子字符串。
这意味着
foo|foo too
会在foo to
之前匹配到foo
。因此,应该使用foo to|foo
。输出:
确保较长的单词始终首先出现的通用方法是对字符串进行排序:
请注意,这只适用于简单字符串,并不一定适用于更复杂的正则表达式,其中较短的正则表达式可以匹配比较长的正则表达式更通用的字符串。
此外,如果您想在找到子字符串时替换整个字符串,那么另一个选择可能是:
请注意,这将替换包含
foo
或bar
的所有模式,即使还有其他部分。