Pandas Python
Pandas Python
Análise de Dados
Do Básico ao Avançado
Prof. Elizeu
Licenciado sob CC BY-SA 4.0 — [Link]/licenses/by-sa/4.0
Sumário
1 Introdução ao Pandas 5
1.1 O que é o Pandas? . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Principais Características . . . . . . . . . . . . . . . . . . 5
1.3 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Primeiro Contato . . . . . . . . . . . . . . . . . . . . . . . 6
2 Series e DataFrames 7
2.1 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Acessando Elementos . . . . . . . . . . . . . . . . . 7
2.2 DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Criando DataFrames . . . . . . . . . . . . . . . . . . . . . 8
2.4 Atributos Importantes . . . . . . . . . . . . . . . . . . . . 9
4 Seleção e Indexação 14
4.1 Selecionar Colunas . . . . . . . . . . . . . . . . . . . . . . 14
4.2 Seleção por Loc e Iloc . . . . . . . . . . . . . . . . . . . . 15
4.3 Seleção Condicional . . . . . . . . . . . . . . . . . . . . . . 15
4.4 Atribuição de Valores . . . . . . . . . . . . . . . . . . . . . 16
2
6 Transformação de Dados 20
6.1 Métodos Apply e Map . . . . . . . . . . . . . . . . . . . . 20
6.2 Renomear e Reordenar . . . . . . . . . . . . . . . . . . . . 21
6.3 Operações Comuns . . . . . . . . . . . . . . . . . . . . . . 21
6.4 Pivoteamento . . . . . . . . . . . . . . . . . . . . . . . . . 22
7 Agrupamento e Agregação 23
7.1 GroupBy . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.2 Transform e Filter . . . . . . . . . . . . . . . . . . . . . . 24
7.3 Agregações Comuns . . . . . . . . . . . . . . . . . . . . . 25
7.4 Tabelas de Frequência . . . . . . . . . . . . . . . . . . . . 25
8 Fusão e Concatenação 26
8.1 Merge (Junção de DataFrames) . . . . . . . . . . . . . . . 26
8.2 Concatenação . . . . . . . . . . . . . . . . . . . . . . . . . 27
8.3 Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9 Visualização de Dados 29
9.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9.2 Gráficos de Linha . . . . . . . . . . . . . . . . . . . . . . . 29
9.3 Gráficos de Barra . . . . . . . . . . . . . . . . . . . . . . . 30
9.4 Gráficos de Pizza . . . . . . . . . . . . . . . . . . . . . . . 30
9.5 Gráfico de Dispersão . . . . . . . . . . . . . . . . . . . . . 30
9.6 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . 31
9.7 Gráficos com Subplots . . . . . . . . . . . . . . . . . . . . 31
10 Exercícios Práticos 33
10.1 Exercício 1: Análise de Vendas . . . . . . . . . . . . . . . 33
10.2 Exercício 2: Limpeza de Dados . . . . . . . . . . . . . . . 34
10.3 Exercício 3: Relatório Completo . . . . . . . . . . . . . . . 35
Introdução ao Pandas
5
• GroupBy: Operações de divisão-aplicar-combinar
1.3 Instalação
import pandas as pd
print ( df )
# Nome Idade Cidade
# 0 Ana 25 S ã o Paulo
# 1 Bruno 30 Rio
# 2 Carlos 35 Belo Horizonte
# 3 Diana 28 Curitiba
Series e DataFrames
2.1 Series
Uma Series é um array unidimensional rotulado, capaz de armazenar
dados de qualquer tipo (inteiros, strings, floats, objetos Python, etc.).
import pandas as pd
import numpy as np
7
s . iloc [0] # 10
s . iloc [ -1] # 40
# Por condi ç ã o
s [ s > 15] # Series com valores > 15
2.2 DataFrames
Um DataFrame é uma estrutura de dados bidimensional rotulada, com
colunas de tipos potencialmente diferentes. Pode ser visto como uma
planilha, uma tabela SQL ou um dicionário de Series.
õ Anatomia de um DataFrame
import pandas as pd
# A partir de um CSV
df = pd . read_csv ( ’ dados . csv ’)
# Tipos de dados
df . dtypes # Mostra tipo de cada coluna
# Informa ç õ es gerais
df . info () # Resumo do DataFrame
# Colunas e í ndice
df . columns # Index ([ ’ Produto ’, ’ Pre ç o ’, ...])
df . index # RangeIndex ( start =0 , stop =1000)
# CSV
df = pd . read_csv ( ’ dados . csv ’)
df = pd . read_csv ( ’ dados . csv ’ , sep = ’; ’ , encoding = ’ latin
-1 ’)
# Excel
df = pd . read_excel ( ’ dados . xlsx ’)
df = pd . read_excel ( ’ dados . xlsx ’ , sheet_name = ’ Vendas ’)
# JSON
df = pd . read_json ( ’ dados . json ’)
# HTML
df = pd . read_html ( ’ tabela . html ’) [0] # Primeira tabela
11
3.2 Parâmetros Importantes
pd . read_csv (
’ dados . csv ’ ,
sep = ’ , ’ , # Delimitador
encoding = ’utf -8 ’ , # Codifica ç ã o
usecols =[ ’A ’ , ’B ’] , # Selecionar colunas
dtype ={ ’ id ’: str } , # Tipos personalizados
parse_dates =[ ’ data ’] , # Converter para datetime
na_values =[ ’N / A ’ , ’ ’] , # Valores para NaN
nrows =1000 , # Ler apenas N linhas
skiprows =[1 , 3] , # Pular linhas
index_col = ’ id ’ # Definir í ndice
)
# CSV
df . to_csv ( ’ saida . csv ’ , index = False , encoding = ’utf -8 ’)
# Excel
df . to_excel ( ’ saida . xlsx ’ , sheet_name = ’ Dados ’ , index =
False )
# JSON
df . to_json ( ’ saida . json ’ , orient = ’ records ’ , force_ascii =
False )
# Parquet
df . to_parquet ( ’ saida . parquet ’ , index = False )
# SQL
df . to_sql ( ’ tabela ’ , engine , if_exists = ’ replace ’ , index =
False )
Seleção e Indexação
import pandas as pd
df = pd . DataFrame ({
’ Nome ’: [ ’ Ana ’ , ’ Bruno ’ , ’ Carlos ’] ,
’ Idade ’: [25 , 30 , 35] ,
’ Sal á rio ’: [5000 , 7000 , 9000]
})
14
4.2 Seleção por Loc e Iloc
ò loc vs iloc
# Condi ç ã o simples
df [ df [ ’ Idade ’] > 30]
# M ú ltiplas condi ç õ es ( OR )
df [( df [ ’ Idade ’] < 28) | ( df [ ’ Sal á rio ’] > 8000) ]
# Usando isin
# between ( intervalo )
df [ df [ ’ Idade ’ ]. between (25 , 35) ]
# String operations
df [ df [ ’ Nome ’ ]. str . startswith ( ’A ’) ]
# Atribuir um valor
df . loc [0 , ’ Sal á rio ’] = 5500
# Deletar coluna
df . drop ( ’ Imposto ’ , axis =1 , inplace = True )
Tratamento de Dados
Ausentes
import pandas as pd
import numpy as np
df = pd . DataFrame ({
’A ’: [1 , 2 , np . nan , 4] ,
’B ’: [ np . nan , 2 , 3 , 4] ,
’C ’: [ ’x ’ , None , ’z ’ , ’w ’]
})
# Verificar se h á NaN
df . isnull () # DataFrame booleano
df . isnull () . sum () # Contagem por coluna
df . isnull () . sum () . sum () # Total de NaN
17
5.2 Removendo Valores Ausentes
# Especificar colunas
df . dropna ( subset =[ ’A ’ , ’B ’ ])
# Valor fixo
df . fillna (0)
# interpola ç ã o
df [ ’A ’ ]. interpolate ()
Transformação de Dados
import pandas as pd
df = pd . DataFrame ({
’ Produto ’: [ ’ notebook ’ , ’ mouse ’ , ’ teclado ’] ,
’ Pre ç o ’: [3500 , 80 , 150]
})
20
’ notebook ’ , ’ Notebook ’
)
# Renomear colunas
df . rename ( columns ={
’ Produto ’: ’ produto ’ ,
’ Pre ç o ’: ’ pre ç o ’
} , inplace = True )
# Reordenar colunas
df = df [[ ’ produto ’ , ’ pre ç o ’ , ’ Categoria ’ ]]
# Tipos de dados
df [ ’ pre ç o ’] = df [ ’ pre ç o ’ ]. astype ( float )
df [ ’ data ’] = pd . to_datetime ( df [ ’ data ’ ])
# Duplicatas
df . duplicated () # Identificar duplicatas
df . drop_duplicates () # Remover duplicatas
df . drop_duplicates ( subset =[ ’ produto ’ ]) # Baseado em
colunas
# Strings
df [ ’ produto ’] = df [ ’ produto ’ ]. str . upper ()
df [ ’ produto ’] = df [ ’ produto ’ ]. str . strip ()
df [ ’ produto ’] = df [ ’ produto ’ ]. str . contains ( ’ note ’)
# Num é ricos
df [ ’ pre ç o ’ ]. round (2)
6.4 Pivoteamento
Agrupamento e Agregação
7.1 GroupBy
O padrão split-apply-combine é fundamental no Pandas:
import pandas as pd
vendas = pd . DataFrame ({
’ Vendedor ’: [ ’ Ana ’ , ’ Ana ’ , ’ Bruno ’ , ’ Bruno ’ , ’
Carlos ’] ,
’ Produto ’: [ ’A ’ , ’B ’ , ’A ’ , ’B ’ , ’A ’] ,
’ Vendas ’: [100 , 150 , 200 , 120 , 180] ,
’ Regi ã o ’: [ ’ SP ’ , ’ SP ’ , ’ RJ ’ , ’ RJ ’ , ’ MG ’]
})
# Agrega ç ã o simples
vendas . groupby ( ’ Vendedor ’) [ ’ Vendas ’ ]. sum ()
# M ú ltiplas agrega ç õ es
vendas . groupby ( ’ Vendedor ’) [ ’ Vendas ’ ]. agg (
[ ’ sum ’ , ’ mean ’ , ’ max ’]
)
23
})
• sum() - Soma
• mean() - Média
• median() - Mediana
• count() - Contagem
• var() - Variância
Fusão e Concatenação
import pandas as pd
clientes = pd . DataFrame ({
’ id ’: [1 , 2 , 3 , 4] ,
’ nome ’: [ ’ Ana ’ , ’ Bruno ’ , ’ Carlos ’ , ’ Diana ’]
})
vendas = pd . DataFrame ({
’ cliente_id ’: [1 , 2 , 2 , 3] ,
’ produto ’: [ ’A ’ , ’B ’ , ’A ’ , ’C ’] ,
’ valor ’: [100 , 200 , 150 , 300]
})
26
# Outer join - todos de ambos
pd . merge ( clientes , vendas ,
left_on = ’ id ’ , right_on = ’ cliente_id ’ , how = ’
outer ’)
8.2 Concatenação
8.3 Join
Visualização de Dados
9.1 Introdução
O Pandas tem integração nativa com Matplotlib, permitindo gráficos rá-
pidos diretamente dos DataFrames.
import pandas as pd
import matplotlib . pyplot as plt
# Estilo recomendado
plt . style . use ( ’ seaborn - v0_8 ’)
vendas_mensais = pd . DataFrame ({
’M ê s ’: [ ’ Jan ’ , ’ Fev ’ , ’ Mar ’ , ’ Abr ’ , ’ Mai ’ , ’ Jun ’] ,
’ Produto_A ’: [150 , 180 , 200 , 170 , 220 , 250] ,
’ Produto_B ’: [100 , 120 , 140 , 130 , 160 , 180]
})
vendas_mensais . set_index ( ’M ê s ’ , inplace = True )
vendas_mensais . plot (
kind = ’ line ’ ,
figsize =(10 , 6) ,
title = ’ Vendas ␣ Mensais ␣ por ␣ Produto ’ ,
marker = ’o ’
)
29
plt . ylabel ( ’ Vendas ␣ ( unidades ) ’)
plt . grid ( True , alpha =0.3)
plt . tight_layout ()
plt . savefig ( ’ vendas_mensais . png ’ , dpi =150)
df = pd . DataFrame ({
’ Pre ç o ’: [10 , 20 , 30 , 40 , 50 , 60 , 70 , 80] ,
’ Vendas ’: [100 , 90 , 80 , 70 , 60 , 50 , 40 , 30] ,
’ Categoria ’: [ ’A ’ ]*4 + [ ’B ’ ]*4
})
9.6 Histograma
import numpy as np
dados = pd . DataFrame ({
’ Idade ’: np . random . normal (35 , 10 , 1000)
})
plt . tight_layout ()
plt . savefig ( ’ dashboard . png ’ , dpi =150)
Dicas de visualização:
Exercícios Práticos
import pandas as pd
import numpy as np
vendas = pd . DataFrame ({
’ Data ’: pd . date_range (
’ 2024 -01 -01 ’ , periods =n , freq = ’D ’
),
’ Produto ’: np . random . choice (
[ ’ Notebook ’ , ’ Mouse ’ , ’ Teclado ’ , ’ Monitor ’] , n
),
’ Regi ã o ’: np . random . choice ([ ’ SP ’ , ’ RJ ’ , ’ MG ’ , ’ RS ’
], n),
’ Quantidade ’: np . random . randint (1 , 50 , n ) ,
’ Pre ç o_Unit á rio ’: np . random . uniform (50 , 3500 , n ) .
round (2)
})
# Calcular total
vendas [ ’ Total ’] = vendas [ ’ Quantidade ’] * vendas [ ’ Pre ç
o_Unit á rio ’]
33
receita_produto = vendas . groupby ( ’ Produto ’) [ ’ Total ’ ].
sum ()
print ( " Receita ␣ por ␣ produto : " )
print ( receita_produto . sort_values ( ascending = False ) . head
() )
# 3. Evolu ç ã o mensal
vendas [ ’M ê s ’] = vendas [ ’ Data ’ ]. dt . to_period ( ’M ’)
evolu ç ã o = vendas . groupby ( ’M ê s ’) [ ’ Total ’ ]. sum ()
print ( " \ nEvolu ç ã o ␣ mensal : " )
print ( evolu ç ã o )
import pandas as pd
import numpy as np
# 1. Identificar problemas
print ( " Valores ␣ ausentes : " )
print ( dados . isnull () . sum () )
# 2. Limpar dados
# Remover linhas com Nome ausente
dados = dados . dropna ( subset =[ ’ Nome ’ ])
# Validar emails
dados [ ’ Email_V á lido ’] = dados [ ’ Email ’ ]. str . contains (
’@ .*\\. ’ , regex = True
)
import pandas as pd
import numpy as np
import matplotlib . pyplot as plt
# Simulando dados
np . random . seed (42)
df = pd . DataFrame ({
’ Data ’: pd . date_range ( ’ 2024 -01 -01 ’ , periods =365 ,
freq = ’D ’) ,
’ Vendas ’: np . random . poisson (100 , 365) ,
’ Receita ’: np . random . uniform (1000 , 5000 , 365)
})
# Gr á fico
fig , ax1 = plt . subplots ( figsize =(12 , 6) )
ax1 . bar ( df [ ’ Data ’] , df [ ’ Vendas ’] ,
color = ’ #306998 ’ , alpha =0.7)
ax1 . set_ylabel ( ’ Vendas ’ , color = ’ #306998 ’)
11.1 Performance
W Dicas de performance
# LENTO - evite !
for i , row in df . iterrows () :
df . loc [i , ’ total ’] = row [ ’ qtd ’] * row [ ’ pre ç o ’]
# R Á PIDO - vetorizado !
df [ ’ total ’] = df [ ’ qtd ’] * df [ ’ pre ç o ’]
11.2 Memória
37
# Verificar uso de mem ó ria
df . info ( memory_usage = ’ deep ’)
Referências e Recursos
• Getting Started
• User Guide
• API Reference
40
• Scikit-learn: Machine Learning