Olá pessoal,
Montei esse exemplo a partir do projeto das vendas online para praticar uma situação bem comum na vida real: limpar e organizar textos despadronizados em colunas de dados.
O exemplo simula um DataFrame com registros de vendas:
import pandas as pd
import numpy as np
df_ex = pd.DataFrame({
'Data de venda': ['01/07/2022','02/07/2022','03/07/2022','04/07/2022','05/07/2022'],
'Cliente': [
'@André_Canção 123',
'Márcia-Tibério 456',
'Ícaro#Tenório 789',
'Luísa*Olivença 012',
"João D'Ávila 345"
],
'Valor da compra': [123.45, 678.90, 234.56, 345.67, 456.78]
})
df_ex
Data de venda | Cliente | Valor da compra |
---|---|---|
01/07/2022 | @André_Canção 123 | 123.45 |
02/07/2022 | Márcia-Tibério 456 | 678.90 |
03/07/2022 | Ícaro#Tenório 789 | 234.56 |
04/07/2022 | Luísa*Olivença 012 | 345.67 |
05/07/2022 | João D'Ávila 345 | 456.78 |
Limpeza e transformação passo a passo
1. Extrair o ID do cliente
A parte numérica no final do nome parece ser um ID único - podemos extrair isso com regex:
df_ex['Id_cliente'] = df_ex['Cliente'].str.extract(r'(\d+)$')[0].astype(np.int64)
r'(\d+)$'
: pega o número no final da string.[0]
: acessa a única coluna do resultado..astype(np.int64)
: converte para inteiro.
2. Padronizar o nome do cliente
Vamos converter tudo para minúsculas:
df_ex['Cliente'] = df_ex['Cliente'].str.lower()
3. Remover caracteres especiais
Limpei símbolos indesejados (acentos foram mantidos):
df_ex['Cliente'] = (df_ex['Cliente']
.str
.replace('[^a-záàâãéêíóôõúç\'\s]', ' ', regex = True)
.str
.strip()
)
[^...]
: qualquer coisa fora desse conjunto será removida.\'
: apóstrofo, como emD'Ávila
.\s
: espaço em branco..str.strip()
: remove espaços extras no início/fim.
Resultado final
df_ex
Data de venda | Cliente | Valor da compra | Id_cliente |
---|---|---|---|
01/07/2022 | andré canção | 123.45 | 123 |
02/07/2022 | márcia tibério | 678.90 | 456 |
03/07/2022 | ícaro tenório | 234.56 | 789 |
04/07/2022 | luísa olivença | 345.67 | 12 |
05/07/2022 | joão d'ávila | 456.78 | 345 |
Tipos finais das colunas
df_ex.dtypes
Data de venda object
Cliente object
Valor da compra float64
Id_cliente int64
dtype: object
Removendo acentos com regex e normalize
Se você quiser remover os acentos, pode combinar o método .normalize()
com uma expressão regular que remove os caracteres diacríticos (como acentos gráficos):
df_ex['Cliente'] = (df_ex['Cliente']
.str
.normalize('NFKD')
.str
.replace(r'[\u0300-\u036f]', '', regex=True)
)
Explicação:
.str.normalize('NFKD')
Aplica a Normalização Unicode NFKD ("Compatibility Decomposition") em cada string.
Caracteres compostos como
"ã"
,"ô"
,"ç"
são decompostos em duas partes:- o caractere base (
"j"
,"o"
,"a"
) - um "marcador" de acento (um combining mark), por exemplo U+0303 para til.
- o caractere base (
Exemplo:
"joão"
→['j','o','a', U+0303, 'o']
.str.replace(r'[\u0300-\u036f]', '', regex=True)
Usa uma expressão regular que corresponde ao intervalo Unicode de combining marks.
Esse conjunto cobre a maioria dos diacríticos usados em línguas latinas (acentos agudo, grave, circunflexo, til, cedilha, etc.).
A chamada substitui cada um desses marcadores por
''
(string vazia), removendo-os.Como resultado, você mantém só o caractere base:
['j','o','a', U+0303, 'o']
→ ao remover U+0303 →['j','o','a','o']
="joao"
No fim, cada valor em df_ex['Cliente']
sai com os acentos "colapsados" no caractere base, por exemplo:
Original | Após normalização + replace |
---|---|
andré canção | andre cancao |
márcia tibério | marcia tiberio |
joão d'ávila | joao d'avila |
O intervalo '[\u0300-\u036f]' faz parte do bloco Combining Diacritical Marks, usado para representar acentos que se combinam com letras base.
Isso é uma forma limpa e direta de retirar acentuação mantendo o restante do texto intacto.
Abraço.