Introdução ao DataFrame
O DataFrame é uma esturtura de dados tabular bidimensional, rotulada e de tamanho mutável no Pandas. É frequentemente comparado a uma planilha ou tabela SQL. A seguir, exploramos sua criação e operações básicas de pré-processamento.
import pandas as pd
import numpy as np
# Gerar um DataFrame com índice de datas e colunas rotuladas
datas_periodo = pd.date_range('2023-01-01', periods=24)
df_com_datas = pd.DataFrame(np.random.randn(24, 4), index=datas_periodo, columns=['Col1', 'Col2', 'Col3', 'Col4'])
# Gerar um DataFrame com índice padrão (numérico)
df_simples = pd.DataFrame(np.random.rand(24, 4))
print("DataFrame com datas:\n", df_com_datas.head())
print("\nDataFrame simples:\n", df_simples.head())
Pré-processamento de Dados
Fatiamento, Concatenação e Agrupamento
Fatiar dados permite dividir um DataFrame em subconjuntos, enquanto a concatenação os combina. O agrupamento é essencial para resumir dados com base em categorias.
# Criar um DataFrame de exemplo com números inteiros
df_exemplo = pd.DataFrame(np.random.randint(1, 5, (10, 4)), columns=['Grupo', 'ValA', 'ValB', 'ValC'])
# Fatiar para obter as primeiras e últimas linhas
primeira_metade = df_exemplo.iloc[:5]
segunda_metade = df_exemplo.iloc[5:]
# Concatenar as partes de volta
df_recomposto = pd.concat([primeira_metade, segunda_metade])
# Agrupar pela coluna 'Grupo' e calcular médias
media_grupo = df_exemplo.groupby('Grupo').mean()
# Agrupar e somar valores por grupo
soma_grupo = df_exemplo.groupby('Grupo').sum()
print("DataFrame original:\n", df_exemplo)
print("\nDataFrame recomposto:\n", df_recomposto)
print("\nMédia por grupo:\n", media_grupo)
print("\nSoma por grupo:\n", soma_grupo)
Seleção e Limpeza de Dados
A seleção de dados pode ser feita por rótulos (loc) ou índices inteiros (iloc). A limpeza envolve tratar valores faltantes ou inconsistentes.
# Criar DataFrame com rótulos de linha personalizados
df_rotulado = pd.DataFrame(np.random.randint(1, 10, (5, 3)),
index=['a', 'b', 'c', 'd', 'e'],
columns=['X', 'Y', 'Z'])
# Inserir um valor ausente (NaN)
df_rotulado.loc['a', 'X'] = np.nan
# Extrair valores específicos usando iloc
subset_valores = df_rotulado.iloc[1:3, 0:2].values
# Adicionar uma nova coluna
df_rotulado['W'] = 'constante'
# Reindexar para incluir uma linha inexistente, criando NaN
df_reindexado = df_rotulado.reindex(['a', 'b', 'c', 'd', 'e', 'f'])
# Remover linhas com qualquer valor NaN
df_limpo = df_reindexado.dropna()
print("DataFrame original com NaN:\n", df_rotulado)
print("\nSubset extraído:\n", subset_valores)
print("\nDataFrame reindexado (com NaN na nova linha 'f'):\n", df_reindexado)
print("\nDataFrame após limpeza (dropna):\n", df_limpo)