Eu tenho uma coluna pandas com algumas strings. Quero agrupar as strings que são semelhantes e substituí-las por sua categoria. No meu exemplo real, tenho 6 strings diferentes e queria substituí-las por 3 strings diferentes para suas categorias.
Encontrei esta resposta sobre como mapear muitos valores para 1 usando a função replace(), então tentei expandir algumas das respostas para fazer um mapeamento de muitos para 1 para vários grupos, no entanto, nem todos os meus valores foram alterados corretamente e eu não sei por quê.
Como um exemplo:
df1 = pd.DataFrame({'col1':['foo', 'foo too', 'bar', 'BAR', 'bar ii']})
col1
0 foo
1 foo too
2 bar
3 BAR
4 bar ii
Em uma das respostas, parecia que você poderia usar '|' para separar diferentes opções de chave se você usou regex, então fiz como abaixo:
df1['col1'].replace({'foo|foo too' : 'Foo',
'bar|BAR|bar ii' : 'Bar'}, regex=True)
Que converteu a maioria das minhas strings, mas não todas:
col1
0 Foo
1 Foo too
2 Bar
3 Bar
4 Bar ii
A partir deste exemplo, eu adivinharia algo a ver com os espaços? embora no meu exemplo real algumas das minhas strings com espaços tenham sido substituídas corretamente, então não tenho certeza. Qualquer ajuda sobre por que isso não funciona/como eu poderia conseguir o que procuro seria apreciada
Você precisa criar seu regex para garantir que uma substring de outro padrão não apareça antes de uma string mais longa.
Isso significa que
foo|foo too
corresponderáfoo
antesfoo to
. Portanto,foo to|foo
deve ser usado.Saída:
Uma maneira genérica de garantir que palavras mais longas sempre apareçam primeiro seria classificar as strings:
Observe que isso funciona apenas com strings simples, não necessariamente com regex mais complexos, para os quais um regex mais curto pode corresponder a uma string mais genérica do que uma mais longa.
Além disso, se você quiser substituir a string completa se uma substring for encontrada, outra opção seria:
Esteja ciente de que isso substituiria todos os padrões que contêm
foo
oubar
mesmo se houver outras peças.