Pandas: Saída Estilizada

Última atualização: 2026-08-26

O passo final da análise de dados é a apresentação — deixar os números falarem por si mesmos. O Pandas Styler transforma um DataFrame em um relatório colorido: vendas altas em verde, baixas em vermelho, barras de progresso incorporadas, valores máximos destacados. Não é necessário escolher cores manualmente no Excel — o Pandas pode fazer tudo sozinho.

⚠️ Nota: O código abaixo deve ser executado em um ambiente Python local.

1. O Que Você Aprenderá


2. Embelezando o Relatório de Vendas de Carol

(1) O Ponto de Doloroso: Um Relatório Numérico Puro Não é Intuitivo o Suficiente

O relatório mensal de vendas de Carol não passa de números, e seu chefe não consegue distinguir o que é alto e o que é baixo:

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'sales': [5200, 3100, 4800, 2900],
    'profit': [1560, 620, 1440, 435],
    'margin': [0.30, 0.20, 0.30, 0.15]
})
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

(2) A Solução: Embelezamento em Uma Linha com Styler

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Conceitos básicos do Styler (dificuldade ⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'sales': [5200, 3100, 4800, 2900],
    'profit': [1560, 620, 1440, 435],
    'margin': [0.30, 0.20, 0.30, 0.15]
})

# Encadeamento de métodos de estilização
styled = (df.style
    .format({'sales': '${:,.0f}', 'profit': '${:,.0f}', 'margin': '{:.1%}'})
    .background_gradient(subset=['sales'], cmap='RdYlGn')
    .highlight_max(subset=['profit'], color='lightgreen')
)
# styled no Jupyter mostra a tabela estilizada
# styled.to_html('report.html') para exportar
print("Tabela estilizada criada!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

3. O Objeto Styler

(1) df.style Retorna um Styler

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Operações básicas do Styler (dificuldade ⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [29.99, 99.99, 149.99, 499.99, 9.99],
    'stock': [50, 120, 80, 35, 200],
    'rating': [4.5, 4.2, 3.8, 4.8, 4.0]
})

# df.style retorna um Styler (não um DataFrame!)
styler = df.style
print(type(styler))  # pandas.io.formats.style.Styler

# Encadeamento de múltiplos estilos
result = (df.style
    .format({'price': '${:.2f}', 'rating': '{:.1f}/5.0'})
    .set_caption('Catálogo de Produtos')
    .set_properties(**{'text-align': 'center'}, subset=['price', 'rating'])
)
# result é renderizado no Jupyter

# O Styler NÃO modifica o DataFrame original
print(df['price'].dtype)  # ainda float64, inalterado
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

4. Formatação com format

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Formatação numérica com format (dificuldade ⭐)

PYTHON
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'salary': [75000.50, 92000.75, 68000.25],
    'bonus': [0.15, 0.20, 0.10],
    'performance': [4.567, 3.891, 4.123]
})

styled = df.style.format({
    'salary': '${:,.2f}',         # $75.000,50
    'bonus': '{:.0%}',             # 15%
    'performance': '{:.1f}/5.0'    # 4,6/5.0
})

# Formata todas as colunas numéricas
styled2 = df.style.format(precision=2)  # 2 casas decimais para todas

# Separador de milhar
styled3 = df.style.format({'salary': '{:,.0f}'})  # 75.001

# Função formatadora personalizada
styled4 = df.style.format({
    'salary': lambda x: f'${x:,.0f}'
})
print("Tabelas formatadas criadas!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

5. Destaque de Mapa de Calor com background_gradient

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Mapa de calor com background_gradient (dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'Q1': [5200, 3100, 4800, 2900],
    'Q2': [5800, 3400, 5100, 3100],
    'Q3': [6100, 3800, 5600, 3500],
    'Q4': [6500, 4100, 5900, 3800]
}).set_index('region')

# Mapa de calor: RdYlGn (vermelho → amarelo → verde)
styled = df.style.background_gradient(cmap='RdYlGn')

# Subconjunto: apenas colunas específicas
styled2 = df.style.background_gradient(
    subset=['Q1', 'Q4'],
    cmap='Blues',
    vmin=2000, vmax=7000
)

# Gradiente por coluna (cada coluna dimensionada independentemente)
styled3 = df.style.background_gradient(cmap='YlOrRd', axis=0)

# Gradiente por linha (cada linha dimensionada independentemente)
styled4 = df.style.background_gradient(cmap='YlOrRd', axis=1)
print("Estilos de mapa de calor criados!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

(1) cmaps Comumente Usados

cmap Efeito Caso de Uso
RdYlGn Vermelho → Amarelo → Verde Maior é melhor
RdYlBu Vermelho → Amarelo → Azul Divergente
Blues Claro → Azul escuro Aumento sequencial
YlOrRd Amarelo → Laranja → Vermelho Maior é pior
coolwarm Azul → Vermelho Desvio

6. Gráficos de Barras Inline com bar

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Barras inline com bar (dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'sales': [5200, 3100, 4800, 2900, 6500],
    'target': [5000, 4000, 5000, 3000, 6000]
})

# Barra dentro das células
styled = df.style.bar(
    subset=['sales'],
    color='lightblue',
    vmin=0, vmax=7000
)

# Atingimento: barra mostra % da meta
df['achievement'] = (df['sales'] / df['target'] * 100).round(1)
styled2 = df.style.bar(
    subset=['achievement'],
    color=['#ff6b6b', '#51cf66'],  # vermelho < 100%, verde >= 100%
    vmin=0, vmax=150
)
print("Estilos de gráfico de barras criados!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

7. Marcação Condicional com highlight

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: highlight_max/min/nulo (dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [29.99, 99.99, 149.99, 499.99, 9.99],
    'stock': [50, 120, 80, 35, np.nan],
    'rating': [4.5, 4.2, 3.8, 4.8, 4.0]
})

# Destaca o valor máximo por coluna
styled = df.style.highlight_max(
    subset=['price', 'stock', 'rating'],
    color='lightgreen'
)

# Destaca o valor mínimo
styled2 = df.style.highlight_min(
    subset=['price', 'rating'],
    color='lightcoral'
)

# Destaca valores NaN
styled3 = df.style.highlight_null(color='yellow')

# Personalizado: destaca estoque baixo (< 40)
def highlight_low_stock(val):
    color = 'red' if val < 40 else ''
    return f'background-color: {color}'

styled4 = df.style.applymap(highlight_low_stock, subset=['stock'])
# Nota: applymap renomeado para map no Pandas 2.x
# styled4 = df.style.map(highlight_low_stock, subset=['stock'])
print("Estilos de destaque criados!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

8. Exemplo Completo: Estilizando um Relatório de Vendas

(5) ▶ Fluxo de Trabalho do Encadeamento de Estilização

100%
graph LR
    A[df.style] --> B[formatação com format]
    B --> C[mapa de calor com background_gradient]
    C --> D[gráfico de barras inline com bar]
    D --> E[marcação condicional com highlight]
    E --> F[título com set_caption]
    F --> G[exportação com to_html / to_excel]
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Estilização abrangente de relatório (dificuldade ⭐⭐⭐)

PYTHON
import pandas as pd
import numpy as np

# ============================================
# Exemplo abrangente: Estilização de relatório de vendas
# format → gradient → bar → highlight → export
# ============================================

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West', 'Central'],
    'revenue': [520000, 310000, 480000, 290000, 410000],
    'cost': [364000, 248000, 336000, 246500, 307500],
    'profit': [156000, 62000, 144000, 43500, 102500],
    'margin': [0.30, 0.20, 0.30, 0.15, 0.25],
    'growth': [0.12, -0.05, 0.08, -0.10, 0.15],
    'customers': [1200, 850, 1100, 680, 950]
}).set_index('region')

# Encadeamento multi-estilo
styled = (df.style
    .format({
        'revenue': '${:,.0f}',
        'cost': '${:,.0f}',
        'profit': '${:,.0f}',
        'margin': '{:.1%}',
        'growth': '{:+.1%}',
        'customers': '{:,}'
    })
    .background_gradient(subset=['margin'], cmap='RdYlGn', vmin=0, vmax=0.4)
    .bar(subset=['customers'], color='lightblue', vmin=0)
    .highlight_max(subset=['profit'], color='lightgreen')
    .highlight_min(subset=['profit'], color='lightcoral')
    .set_caption('Relatório de Vendas Regionais 2024')
    .set_properties(**{'text-align': 'right'}, subset=['revenue', 'cost', 'profit'])
)

# Exportação
# styled.to_html('report.html')
# styled.to_excel('report.xlsx', engine='openpyxl')
print("Relatório estilizado completo criado!")
TEXT 📖 Somente leitura
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado, então instale-o em sua máquina (`pip install pandas`) e acompanhe na prática. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

❓ Perguntas Frequentes

P: O Styler modifica os dados? R: Não — o Styler afeta apenas a exibição; os dados no DataFrame original permanecem inalterados. df.style é uma decoração da "camada de visualização" que nunca toca na "camada de dados". Após a formatação, df['salary'] ainda é float64, não uma string. Você pode criar com segurança múltiplos Stylers estilizados de maneira diferente a partir do mesmo DataFrame.

P: Como escolho um cmap para background_gradient? R: Se maior é melhor, use RdYlGn (vermelho → verde); se maior é pior, use YlOrRd (amarelo → vermelho); para desvio divergente, use coolwarm (azul → vermelho); para aumento sequencial, use Blues. O princípio para escolher um cmap: a intuição da cor deve corresponder ao significado comercial. Teste o efeito no Jupyter antes de decidir.

P: Como especifico um intervalo com subset? R: Três maneiras: ① uma lista de nomes de colunas subset=['sales', 'profit']; ② uma fatia subset=pd.IndexSlice[:, 'Q1':'Q4']; ③ um filtro condicional subset=pd.IndexSlice[df['sales'] > 3000, :]. Uma lista de nomes de colunas é a mais comum.

P: Caracteres chineses ilegíveis no to_html? R: Especifique a codificação: styled.to_html(encoding='utf-8'). Se estiver gravando em um arquivo, use with open('report.html', 'w', encoding='utf-8') as f: f.write(styled.to_html()). Certifique-se de que o arquivo HTML declare <meta charset="utf-8">.

P: Os estilos podem ser exportados para o Excel? R: Sim — styled.to_excel('report.xlsx', engine='openpyxl'). As cores e formatação são preservadas no Excel. No entanto, alguns estilos podem não corresponder exatamente (por exemplo, gráficos de barras inline tornam-se formatação condicional no Excel). Você precisará de pip install openpyxl.

P: Qual é a diferença entre applymap e map? R: No Pandas 2.x, Styler.applymap foi renomeado para Styler.map. A funcionalidade é a mesma — aplicar uma função de estilo a cada célula. apply funciona por linha/coluna (o parâmetro axis), enquanto map funciona por célula. Nas versões mais recentes, basta usar map.

P: Como encadeio múltiplos estilos juntos? R: Os métodos do Styler retornam um objeto Styler, então o encadeamento é suportado naturalmente: df.style.format({...}).background_gradient(...).bar(...).highlight_max(...). Eles são aplicados de cima para baixo, e um estilo posterior substitui qualquer estilo anterior conflitante. Ordem recomendada: format → gradient → bar → highlight → set_caption.


📖 Resumo


📝 Exercícios

  1. Básico (dificuldade ⭐): Crie um DataFrame com colunas de salário/bônus, use format para formatá-los como moeda e porcentagem, e use highlight_max para marcar o salário mais alto.
  2. Intermediário (dificuldade ⭐⭐): Crie um DataFrame de vendas trimestrais (linhas = regiões, colunas = Q1-Q4), e combine um mapa de calor background_gradient(cmap='RdYlGn') + barras inline bar + formatação de separador de milhar format.
  3. Desafio (dificuldade ⭐⭐⭐): Simule um relatório de vendas para 5 regiões (receita/custo/lucro/margem/crescimento), e complete uma cadeia de estilização de 5 etapas: format multi-formato → gradient(margem) → bar(clientes) → highlight_max(lucro) → exportação to_html.

← Lição Anterior: Otimização de Desempenho · Próxima Lição: Projeto - Análise de Dados →

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%