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.
1. O Que Você Aprenderá
- ❶ O objeto Styler
- ❷ Formatação com
format - ❸ Destaque de mapa de calor com
background_gradient - ❹ Gráficos de barras inline com
bar - ❺ Marcação condicional com
highlight
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:
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]
})
> **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
> **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 ⭐)
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!")
> **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
> **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 ⭐)
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
> **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
> **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 ⭐)
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!")
> **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
> **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 ⭐⭐)
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!")
> **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
> **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 ⭐⭐)
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!")
> **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
> **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 ⭐⭐)
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!")
> **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
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]
> **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
> **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 ⭐⭐⭐)
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!")
> **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 fatiasubset=pd.IndexSlice[:, 'Q1':'Q4']; ③ um filtro condicionalsubset=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, usewith 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á depip 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.
applyfunciona por linha/coluna (o parâmetroaxis), enquantomapfunciona por célula. Nas versões mais recentes, basta usarmap.
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
df.styleretorna um objeto Styler, que afeta apenas a exibição e não modifica os dadosformatformata números: moeda (${:,.0f}) / porcentagem ({:.0%}) / precisão (precision)background_gradientdestaque de mapa de calor:cmapescolhe as cores,subsetescolhe o intervalo,axiscontrola a direçãobargráficos de barras inline:coloré uma única cor ou duas cores,vmin/vmaxcontrolam o intervalohighlight_max/min/nulldestaque condicional,map/applypara condições personalizadas- Encadeamento:
format→gradient→bar→highlight→caption to_html/to_excelexporta relatórios com estilos
📝 Exercícios
- Básico (dificuldade ⭐): Crie um DataFrame com colunas de salário/bônus, use
formatpara formatá-los como moeda e porcentagem, e usehighlight_maxpara marcar o salário mais alto. - 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 inlinebar+ formatação de separador de milharformat. - 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:
formatmulti-formato →gradient(margem) →bar(clientes) →highlight_max(lucro) → exportaçãoto_html.
← Lição Anterior: Otimização de Desempenho · Próxima Lição: Projeto - Análise de Dados →