Boas Felipe!Tudo bem? Espero que sim!
Esse problema que você relatou é uma das coisas que ocorrem quando trabalhamos com dados no mundo real, especialmente quando a origem de dados não é padronizada. Nesse caso, existem algumas formas de tratar esses dados, Vou mostrar uma que creio ser a mais eficiente.
Primeiro, vou criar um Dataset que imita o que você reportou:
cidades = ['São Paulo', 'sao paulo', 'são Paulo', 'São Paulo']
df = pd.DataFrame(cidades, columns=['cidade'], index=range(4))
df
Que resulta em:
| cidade |
---|
0 | São Paulo |
1 | sao paulo |
2 | são Paulo |
3 | São Paulo |
Agora, precisamos instalar a biblioteca unidecode, que faz retirar os acentos das palavras sem grandes dificuldades, através do comando ! pip install unidecode
, se estiver usando o Google Collab, ou o mesmo comando sem o ! na frente, caso esteja utilizando o terminal.
Agora, vamos importar a biblioteca e usar a função unidecode para retirar os acentos das várias grafias de São Paulo:
from unidecode import unidecode
df.cidade = df.cidade.map(unidecode)
Agora, nosso dataframe está com os nomes das cidades sem acento:
| cidade |
---|
0 | Sao Paulo |
1 | sao paulo |
2 | sao Paulo |
3 | Sao Paulo |
Para resolver a questão dos caracteres maísculos e minúsculos, existem algumas técnicas, que normalmente consistem em deixar todos os caracteres da palavra maiúsculos ou minusculos, o que não é muito elegante, mas funciona. Nesse caso, vamos usar uma função parecida da biblioteca str que está inclusa no python base:
df.cidade = df.cidade.str.title()
df.to_markdown()
A função title()
transforma a primeira letra de cada palavra em maiúscula, o que eu considero uma solução mais elegante. Agora, temos em nosso DataFrame:
| cidade |
---|
0 | Sao Paulo |
1 | Sao Paulo |
2 | Sao Paulo |
3 | Sao Paulo |
E é nesse ponto que gostaríamos de chegar, pois agora, basta restituir o til (~) na palavra, o que vamos fazer através de um outro map()
na Series da cidade:
cidades_corretas = {'Sao Paulo': 'São Paulo'}
df.cidade = df.cidade.map(cidades_corretas)
Que resulta em:
| cidade |
---|
0 | São Paulo |
1 | São Paulo |
2 | São Paulo |
3 | São Paulo |
Em suma, devemos tentar trabalhar com as possibilidades aproximando o máximo de um padrão, para isso retiramos os caracteres especiais e utilizamos uma estratégia para ignorar mudanças de letras minúsculas e maiúsculas.
Por fim, quando obtivemos o mesmo resultado de caracteres para todas as variações, voltamos à palavra que nos interessava através do mapeamento via dicionário.
Espero ter ajudado!Bons estudos!!