Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Limpando e transformando colunas com `.str` e regex

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 vendaClienteValor da compra
01/07/2022@André_Canção 123123.45
02/07/2022Márcia-Tibério 456678.90
03/07/2022Ícaro#Tenório 789234.56
04/07/2022Luísa*Olivença 012345.67
05/07/2022João D'Ávila 345456.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 em D'Ávila.
  • \s: espaço em branco.
  • .str.strip(): remove espaços extras no início/fim.

Resultado final

df_ex
Data de vendaClienteValor da compraId_cliente
01/07/2022andré canção123.45123
02/07/2022márcia tibério678.90456
03/07/2022ícaro tenório234.56789
04/07/2022luísa olivença345.6712
05/07/2022joão d'ávila456.78345

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.
    • 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:

OriginalApós normalização + replace
andré cançãoandre cancao
márcia tibériomarcia tiberio
joão d'ávilajoao d'avila

O intervalo '[\u0300-\u036f]' faz parte do bloco Combining Diacritical Marks, usado para representar acentos que se combinam com letras base.

Combining Diacritical Marks

Isso é uma forma limpa e direta de retirar acentuação mantendo o restante do texto intacto.

Abraço.

2 respostas
solução!

E aí, Carlos! Tudo bem?

Parabéns! Mantenha o ritmo nos exercícios e continue compartilhando na nossa comunidade.

Percebi que você dominou o uso de expressões regulares para extrair padrões, aplicou muito bem o método str.normalize('NFKD') para tratar acentuação e ainda entendeu a relevância de padronizar textos para garantir consistência nas análises de dados.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá, Daniel.

Muito obrigado pelo retorno positivo.

Gostei da sua recomendação do curso "Praticando Python: Strings e Regex". Já incluí ele no meu plano de estudos.

Abraço!