Introdução ao Pandas
O Pandas é uma biblioteca fundamental do ecossistema Python voltada para análise e manipulação de dados. Ele fornece estruturas de dados poderosas e ferramentas eficientes para trabalhar com dados tabulares e séries temporais.
Seu nome vem de “Python Data Analysis Library”, e ele é amplamente utilizado em ciência de dados, machine learning, estatística e engenharia de dados. Com o Pandas, tarefas que seriam complexas com listas e dicionários se tornam intuitivas, como filtrar linhas, agrupar dados, lidar com valores ausentes e muito mais.
Além disso, o Pandas integra-se facilmente com outras bibliotecas populares como NumPy, Matplotlib e Scikit-learn, tornando-se uma peça-chave em qualquer pipeline de dados em Python.
Instalando e configurando o Pandas
Antes de começar, é necessário instalar o Pandas. Isso pode ser feito facilmente com o pip:
pip install pandas
Para quem utiliza o Anaconda, o Pandas já vem pré-instalado, mas pode ser atualizado com:
conda update pandas
Após a instalação, basta importar a biblioteca em seu script ou notebook:
import pandas as pd
A convenção pd
é usada pela comunidade para facilitar a escrita de código.
Entendendo Series e DataFrames
As duas principais estruturas de dados do Pandas são:
Series
Uma Series é uma estrutura unidimensional que pode armazenar dados de qualquer tipo (inteiros, strings, floats, objetos Python, etc.). Ela é semelhante a uma lista ou array, mas com rótulos para cada elemento.
import pandas as pd
serie = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(serie)
DataFrame
O DataFrame é a estrutura mais usada no Pandas. Ele é uma tabela bidimensional com rótulos de linhas e colunas. Pode ser comparado a uma planilha ou tabela de banco de dados.
dados = {'Nome': ['Ana', 'Bruno', 'Carlos'],
'Idade': [28, 34, 25]}
df = pd.DataFrame(dados)
print(df)
O DataFrame é extremamente versátil, oferecendo inúmeras formas de acessar, modificar e analisar dados.
Carregando e explorando conjuntos de dados
Uma das grandes vantagens do Pandas é sua capacidade de ler e escrever dados em diversos formatos, como CSV, Excel, JSON, entre outros.
Carregando arquivos CSV
df = pd.read_csv('dados.csv')
Você também pode passar parâmetros como delimitador, codificação e colunas específicas:
df = pd.read_csv('dados.csv', sep=';', encoding='utf-8', usecols=['nome', 'idade'])
Explorando dados
Após carregar o DataFrame, algumas funções são essenciais para conhecer seu conteúdo:
df.head() # Mostra as primeiras 5 linhas
df.tail() # Mostra as últimas 5 linhas
df.shape # Mostra o número de linhas e colunas
df.columns # Lista os nomes das colunas
df.info() # Exibe informações gerais sobre o DataFrame
df.describe() # Mostra estatísticas descritivas das colunas numéricas
Esses comandos são ideais para fazer uma análise exploratória inicial dos dados.
Manipulação de dados: filtragem, ordenação e seleção
Seleção de colunas e linhas
Para acessar uma coluna:
df['idade']
Para acessar várias colunas:
df[['nome', 'idade']]
Para acessar linhas por índice:
df.iloc[0] # Primeira linha
df.iloc[0:3] # Da linha 0 até a 2
Para acessar por rótulo:
df.loc[0] # Linha com índice 0
Filtrando dados
Você pode aplicar condições para filtrar:
df[df['idade'] > 30]
Ordenando dados
Ordenação por uma coluna:
df.sort_values(by='idade')
Ordenação decrescente:
df.sort_values(by='idade', ascending=False)
Essas técnicas são a base para limpar e organizar seus dados de forma eficaz.
Tratando dados faltantes e inconsistências
Dados reais raramente são perfeitos. O Pandas oferece recursos robustos para lidar com valores ausentes e inconsistências.
Detectando valores nulos
df.isnull() # Indica com True os valores ausentes
df.isnull().sum() # Conta quantos valores ausentes por coluna
Preenchendo valores nulos
Você pode substituir valores ausentes por uma constante ou estatística:
df.fillna(0) # Substitui por 0
df.fillna(df['salario'].mean()) # Substitui pela média
Removendo valores nulos
df.dropna() # Remove linhas com qualquer valor nulo
df.dropna(how='all') # Remove linhas só se todos os valores forem nulos
df.dropna(subset=['idade']) # Remove linhas com nulos na coluna 'idade'
Corrigindo inconsistências
Renomear colunas, substituir valores e alterar tipos:
df.columns = df.columns.str.lower()
df['estado'] = df['estado'].str.strip()
df['idade'] = df['idade'].astype(int)
Essas práticas garantem dados mais limpos e prontos para análise.
Operações estatísticas e agregações
O Pandas oferece métodos estatísticos integrados para análise rápida dos dados.
Estatísticas descritivas
df['idade'].mean() # Média
df['idade'].median() # Mediana
df['idade'].std() # Desvio padrão
df['idade'].min() # Mínimo
df['idade'].max() # Máximo
df['idade'].value_counts() # Frequência de valores
Agregações com groupby
O método groupby
é poderoso para análises por grupos:
df.groupby('estado')['salario'].mean()
Você pode aplicar várias funções:
df.groupby('departamento')['salario'].agg(['mean', 'max', 'min'])
Essas ferramentas permitem gerar relatórios e sumarizações com poucas linhas de código.
Mesclando e combinando DataFrames
Em muitos casos, seus dados estarão distribuídos em várias tabelas. O Pandas facilita a junção e concatenação desses dados.
Concatenando DataFrames
Unir dados verticalmente ou horizontalmente:
df_concatenado = pd.concat([df1, df2], axis=0) # Por linhas
df_concatenado = pd.concat([df1, df2], axis=1) # Por colunas
Mesclando DataFrames
Similar ao SQL JOIN
:
df_merged = pd.merge(df1, df2, on='id') # junção por coluna comum
Você também pode definir o tipo de junção:
pd.merge(df1, df2, how='left', on='id')
pd.merge(df1, df2, how='inner', on='id')
Isso é essencial para integrar informações vindas de fontes diferentes.
Exportando dados para diversos formatos
Após manipular seus dados, você pode exportá-los para diversos formatos com facilidade.
Exportando para CSV
df.to_csv('saida.csv', index=False)
Exportando para Excel
df.to_excel('saida.xlsx', index=False)
Exportando para JSON
df.to_json('saida.json')
Essas exportações permitem compartilhar ou reutilizar seus dados em outros sistemas.
Dicas avançadas para otimizar seu código com Pandas
Trabalhe com amostras menores
Para bases grandes, analise uma amostra:
df.sample(100)
Use tipos de dados otimizados
Converter colunas categóricas ajuda a economizar memória:
df['categoria'] = df['categoria'].astype('category')
Use métodos vetorizados
Evite loops; prefira operações diretas com Pandas:
df['nova_coluna'] = df['coluna1'] + df['coluna2']
Use o método query
para filtros complexos
df.query('idade > 30 and estado == "SP"')
Essas práticas tornam seu código mais rápido, legível e eficiente.