Pandas Python
Pandas Python
Analise de Dados
Do Basico ao Avancado
Prof. Elizeu
Licenciado sob CC BY-SA 4.0 — [Link]/licenses/by-sa/4.0
Sumário
1 Introducao ao Pandas 5
1.1 O que e o Pandas? . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Principais Caracteristicas . . . . . . . . . . . . . . . . . . 5
1.3 Instalacao . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Selecao e Indexacao 14
4.1 Selecionar Colunas . . . . . . . . . . . . . . . . . . . . . . 14
4.2 Selecao por Loc e Iloc . . . . . . . . . . . . . . . . . . . . 15
4.3 Selecao Condicional . . . . . . . . . . . . . . . . . . . . . . 15
4.4 Atribuicao de Valores . . . . . . . . . . . . . . . . . . . . . 16
2
6 Transformacao de Dados 20
6.1 Metodos Apply e Map . . . . . . . . . . . . . . . . . . . . 20
6.2 Renomear e Reordenar . . . . . . . . . . . . . . . . . . . . 21
6.3 Operacoes Comuns . . . . . . . . . . . . . . . . . . . . . . 21
6.4 Pivoteamento . . . . . . . . . . . . . . . . . . . . . . . . . 22
7 Agrupamento e Agregacao 23
7.1 GroupBy . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.2 Transform e Filter . . . . . . . . . . . . . . . . . . . . . . 24
7.3 Agregacoes Comuns . . . . . . . . . . . . . . . . . . . . . 25
7.4 Tabelas de Frequencia . . . . . . . . . . . . . . . . . . . . 25
8 Fusao e Concatenacao 26
8.1 Merge (Juncao de DataFrames) . . . . . . . . . . . . . . . 26
8.2 Concatenacao . . . . . . . . . . . . . . . . . . . . . . . . . 27
8.3 Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9 Visualizacao de Dados 29
9.1 Introducao . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
9.2 Graficos de Linha . . . . . . . . . . . . . . . . . . . . . . . 29
9.3 Graficos de Barra . . . . . . . . . . . . . . . . . . . . . . . 30
9.4 Graficos de Pizza . . . . . . . . . . . . . . . . . . . . . . . 30
9.5 Grafico de Dispersao . . . . . . . . . . . . . . . . . . . . . 30
9.6 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . 31
9.7 Graficos com Subplots . . . . . . . . . . . . . . . . . . . . 31
10 Exercicios Praticos 33
10.1 Exercicio 1: Analise de Vendas . . . . . . . . . . . . . . . 33
10.2 Exercicio 2: Limpeza de Dados . . . . . . . . . . . . . . . 34
10.3 Exercicio 3: Relatorio Completo . . . . . . . . . . . . . . . 35
Introducao ao Pandas
5
• GroupBy: Operacoes de divisao-aplicar-combinacao
1.3 Instalacao
import pandas as pd
print ( df )
# Nome Idade Cidade
# 0 Ana 25 Sao Paulo
# 1 Bruno 30 Rio
# 2 Carlos 35 Belo Horizonte
# 3 Diana 28 Curitiba
Series e DataFrames
2.1 Series
Uma Series e 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 condicao
s [ s > 15] # Series com valores > 15
2.2 DataFrames
Um DataFrame e uma estrutura de dados bidimensional rotulada, com
colunas de tipos potencialmente diferentes. Pode ser visto como uma
planilha, uma tabela SQL ou um dicionario de Series.
õ Anatomia de um DataFrame
import pandas as pd
# A partir de um dicionario
df = pd . DataFrame ({
’ Produto ’: [ ’ Notebook ’ , ’ Mouse ’ , ’ Teclado ’] ,
’ Preco ’: [3500 , 80 , 150] ,
’ Estoque ’: [15 , 50 , 30]
})
# A partir de um CSV
df = pd . read_csv ( ’ dados . csv ’)
# Tipos de dados
df . dtypes # Mostra tipo de cada coluna
# Informacoes gerais
df . info () # Resumo do DataFrame
# Estatisticas descritivas
df . describe () # Media , desvio , min , max , quartis
# Colunas e indice
df . columns # Index ([ ’ Produto ’, ’ Preco ’, ...])
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 Parametros Importantes
pd . read_csv (
’ dados . csv ’ ,
sep = ’ , ’ , # Delimitador
encoding = ’utf -8 ’ , # Codificacao
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 indice
)
# 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 )
Selecao e Indexacao
import pandas as pd
df = pd . DataFrame ({
’ Nome ’: [ ’ Ana ’ , ’ Bruno ’ , ’ Carlos ’] ,
’ Idade ’: [25 , 30 , 35] ,
’ Salario ’: [5000 , 7000 , 9000]
})
14
4.2 Selecao por Loc e Iloc
ò loc vs iloc
# Condicao simples
df [ df [ ’ Idade ’] > 30]
# Multiplas condicoes ( OR )
df [( df [ ’ Idade ’] < 28) | ( df [ ’ Salario ’] > 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 , ’ Salario ’] = 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 ha NaN
df . isnull () # DataFrame booleano
df . isnull () . sum () # Contagem por coluna
df . isnull () . sum () . sum () # Total de NaN
# Porcentagem de ausencia
( df . isnull () . sum () / len ( df ) ) * 100
17
5.2 Removendo Valores Ausentes
# Especificar colunas
df . dropna ( subset =[ ’A ’ , ’B ’ ])
# Valor fixo
df . fillna (0)
# interpolacao
df [ ’A ’ ]. interpolate ()
Transformacao de Dados
import pandas as pd
df = pd . DataFrame ({
’ Produto ’: [ ’ notebook ’ , ’ mouse ’ , ’ teclado ’] ,
’ Preco ’: [3500 , 80 , 150]
})
20
’ notebook ’ , ’ Notebook ’
)
# Renomear colunas
df . rename ( columns ={
’ Produto ’: ’ produto ’ ,
’ Preco ’: ’ preco ’
} , inplace = True )
# Reordenar colunas
df = df [[ ’ produto ’ , ’ preco ’ , ’ Categoria ’ ]]
# Tipos de dados
df [ ’ preco ’] = df [ ’ preco ’ ]. 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 ’)
# Numericos
df [ ’ preco ’ ]. round (2)
6.4 Pivoteamento
Agrupamento e Agregacao
7.1 GroupBy
O padrao split-apply-combine e 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] ,
’ Regiao ’: [ ’ SP ’ , ’ SP ’ , ’ RJ ’ , ’ RJ ’ , ’ MG ’]
})
# Agregacao simples
vendas . groupby ( ’ Vendedor ’) [ ’ Vendas ’ ]. sum ()
# Multiplas agregacoes
vendas . groupby ( ’ Vendedor ’) [ ’ Vendas ’ ]. agg (
[ ’ sum ’ , ’ mean ’ , ’ max ’]
)
23
})
• sum() - Soma
• mean() - Media
• median() - Mediana
• count() - Contagem
• var() - Variancia
Fusao e Concatenacao
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 Concatenacao
8.3 Join
Visualizacao de Dados
9.1 Introducao
O Pandas tem integracao nativa com Matplotlib, permitindo graficos ra-
pidos diretamente dos DataFrames.
import pandas as pd
import matplotlib . pyplot as plt
# Estilo recommandado
plt . style . use ( ’ seaborn - v0_8 ’)
vendas_mensais = pd . DataFrame ({
’ Mes ’: [ ’ 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 ( ’ Mes ’ , 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 ({
’ Preco ’: [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 visualizacao:
Exercicios Praticos
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
),
’ Regiao ’: np . random . choice ([ ’ SP ’ , ’ RJ ’ , ’ MG ’ , ’ RS ’
], n),
’ Quantidade ’: np . random . randint (1 , 50 , n ) ,
’ Preco_Unitario ’: np . random . uniform (50 , 3500 , n ) .
round (2)
})
# Calcular total
vendas [ ’ Total ’] = vendas [ ’ Quantidade ’] * vendas [ ’
Preco_Unitario ’]
33
receita_produto = vendas . groupby ( ’ Produto ’) [ ’ Total ’ ].
sum ()
print ( " Receita ␣ por ␣ produto : " )
print ( receita_produto . sort_values ( ascending = False ) . head
() )
# 3. Evolucao mensal
vendas [ ’ Mes ’] = vendas [ ’ Data ’ ]. dt . to_period ( ’M ’)
evolucao = vendas . groupby ( ’ Mes ’) [ ’ Total ’ ]. sum ()
print ( " \ nEvolucao ␣ mensal : " )
print ( evolucao )
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_Valido ’] = 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)
})
# Grafico
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 [ ’ preco ’]
# RAPIDO - vetorizado !
df [ ’ total ’] = df [ ’ qtd ’] * df [ ’ preco ’]
11.2 Memoria
37
# Verificar uso de memoria
df . info ( memory_usage = ’ deep ’)
Referencias e Recursos
• Getting Started
• User Guide
• API Reference
40
• Scikit-learn: Machine Learning