Como usar o objeto DataFrame da biblioteca Pandas em Python
Como usar o objeto DataFrame da biblioteca Pandas em Python
Anteriormente falamos sobre o objeto Series do Pandas, e neste artigo vamos explorar algumas funções de um outro tipo de objeto muito comum também fornecido pelo módulo Pandas, o DataFrame.
Os DataFrames do Pandas são uma estrutura de dados bastante versátil e poderosa que pode ser usada em análise, manipulação e processamento de dados em Python. Eles são empregados em uma ampla gama de aplicações de várias áreas, incluindo análise de dados, ciência de dados, engenharia, finanças, pesquisa e muito mais.
Algumas das principais aplicações dos DataFrames do Pandas incluem:
- Pré-processamento de Dados: Limpeza, formatação, dados duplicados, valores ausentes, transformação nos dados
- Análise e Exploração de Dados: Importação de dados, Cálculos de Estatística Descritiva (média, mediana, desvio-padrão, etc.).
- Manipulação de Dados: Filtro, seleção e ordenação para extrair informações específicas dos dados; funções de agregação, colunas calculadas
- Análise de Séries Temporais: Manipulação e análise de dados temporais, como séries temporais de preços de ações, dados climáticos, etc.; reamostragem
- Modelagem Estatística e Machine Learning: Criação de conjuntos de treinamento e teste em aprendizado de máquina, divisão de dados para validação cruzada, etc.
entre muitas outras.
Além disso, os DataFrames podem ser integrados com outras bibliotecas, como por exemplo as bibliotecas NumPy, SciPy, Matplotlib e inúmeras outras, permitindo executar diversas tarefas adicionais, como visualização de dados e cálculos complexos sobre os datasets, por exemplo.
O que é um DataFrame?
Um objeto do tipo DataFrame representa uma tabela de dados retangular bidimensional semelhante a uma tabela de banco de dados ou uma planilha do Excel, contendo uma coleção ordenada de colunas, em que cada uma pode ter um tipo de valor diferente (numérico, string, booleano etc.).
O DataFrame possui índices tanto para linha quanto para coluna; pode ser imaginado como um array de objetos Series, todos compartilhando o mesmo índice.
Há várias formas de construir um DataFrame, embora as mais comuns sejam a partir de dados armazenados em bancos de dados, arquivos CSV, arquivos de planilhas como o Excel, dicionários com listas de mesmo tamanho ou ainda a partir de arrays NumPy, entre outras.
Neste tutorial vamos criar DataFrames a partir de dicionários para explorar algumas de suas funcionalidades. Nos próximos tutoriais, vamos trabalhar também com importação de dados de planilhas do Excel, arquivos CSV e tabelas de bancos de dados relacionais, entre outras tarefas.
Criar um DataFrame a partir de um Dicionário
Vamos começar criando um DataFrame de exemplo a partir de um dicionário de dados. Antes disso, precisamos importar o módulo em nosso script:
import pandas as pd
Vamos criar agora um DataFrame a partir de um dicionário que contém nomes de países, quantidade de títulos mundiais da FIFA, e ano em que o país ganhou seu primeiro título.
dicionario={'País':['Brasil','Uruguai','Inglaterra','Espanha','Holanda','Itália','Argentina','Alemanha','França'], 'Ano':[1958,1930,1966,2010,None,1934,1978,1954,1998], 'Titulos':[5,2,1,1,0,4,3,4,2] } dados = pd.DataFrame(dicionario) print(dados)
Saída:
País Ano Titulos 0 Brasil 1958.0 5 1 Uruguai 1930.0 2 2 Inglaterra 1966.0 1 3 Espanha 2010.0 1 4 Holanda NaN 0 5 Itália 1934.0 4 6 Argentina 1978.0 3 7 Alemanha 1954.0 4 8 França 1998.0 2
Note que na linha correspondente à Holanda a coluna Ano traz o valor NaN, que significa “Not a Number” (Não é um Número), indicando que este dado está ausente (a Holanda ainda não ganhou nenhuma copa, por isso um valor para a coluna de ano não existe!)
Mostrar início ou fim do dataset
Se o conjunto de dados for grande e não quisermos exibi-lo inteiro na tela, podemos imprimir apenas as cinco primeiras ou as cinco últimas linhas com os métodos head() e tail(), respectivamente:
# 5 primeiras linhas print(dados.head()) # 5 últimas linhas print(dados.tail())
Por padrão, o Pandas limita o número de linhas exibidas na tela a 60 linhas e o número de colunas a 20 colunas, para evitar saída de grandes volumes de dados.
Manipulação de colunas
Podemos alterar a ordem das colunas passando como parâmetro ao método .DataFrame() uma lista de valores a serem usados como cabeçalho:
dados = pd.DataFrame(dados, columns=['Titulos','País','Ano']) print(dados)
Para ver apenas os nomes das colunas constituintes do df:
print(dados.columns)
Para imprimir colunas individuais (em vez do DataFrame completo) podemos passar o nome da coluna desejada como valor de índice (entre colchetes), ou então chamar a coluna pelo seu nome como uma propriedade (precedida de um ponto):
print('Países:') print(dados['País']) print('\nAnos:') print(dados.Ano)
Adicionamos uma nova coluna ao DF simplesmente passando seu nome entre colchetes, e atribuindo valores a partir de uma sequência, como uma lista. Podemos inicializar a coluna com um único valor também (mesmo valor em todas as linhas), como por exemplo o valor 0:
# Acrescentar uma coluna ao DataFrame: dados['Participações'] = 0 print(dados)
# Preencher a coluna com valores de uma lista:
part = [22,14,16,16,11,18,18,20,16]
dados['Participações'] = part
print(dados)
Para excluir uma coluna do DataFrame empregamos a função del:
# Excluir coluna "Participações"
del dados['Participações']
print(dados)
Manipulação de linhas
É possível excluir uma linha usando o método .drop(), passando o número da linha a excluir como um valor de índice. No exemplo a seguir vamos criar um novo DataFrame a partir do atual, excluindo nele a linha 4:
# Excluir a linha 4 (Holanda)
dados2 = dados.drop([4])
print(dados2)
Para excluir várias linhas de uma vez, basta passar uma lista com seus números de índice:
# Excluir as linhas 3, 4 e 5 de uma vez
dados2 = dados.drop([4, 3, 5])
print(dados2)
Para excluir uma linha no DataFrame em si, sem precisar criar uma cópia dele, usamos o parâmetro inplace=True:
# Excluir linhas in loco
dados.drop(4, inplace=True)
print(dados)
Slicing em DataFrames
Podemos retornar um conjunto de linhas passando seus índices, inclusive usando fatiamento (slicing):
# Retornar linhas de 1 a 5:
print(dados[1:5])
Também é possível realizar essa operação usando rótulos em vez de números de índice:
# Fatiamento com rótulos dicionario={'País':['Brasil','Uruguai','Inglaterra','Espanha','Holanda','Itália','Argentina'], 'Ano':[1958,1930,1966,2010,None,1934,1978], 'Titulos':[5,2,1,1,0,4,3] } dados = pd.DataFrame(dicionario, index=['a','b','c','d','e','f','g']) # Mostra df completo print(dados, '\n') # Mostra apenas linhas de rótulos b até e: print(dados['b':'e'])
Indexação: loc() e iloc()
Podemos realizar indexação com método .loc(), retornando linhas e colunas específicas apenas por meio de seus rótulos:
# Indexação com loc # Linha b, colunas de País e Títulos print(dados.loc['b',['País', 'Titulos']]) # Linhas de a a d, coluna de Ano: print(dados.loc[:'d','Ano'])
Ou ainda indexar com método .iloc(), que retorna as linhas e colunas específicas de acordo com números de índices:
# Indexação com iloc
print(dados.iloc[1,[0, 2]])
Ordenação em Dataframes
Podemos exibir os dados ordenados por índice tanto em ordem crescente quando decrescente com o método sort_index():
# Ordenação por índice print(dados.sort_index()) # Ordenação por índice em ordem inversa print(dados.sort_index(ascending=False)) Para ordenar os dados pelos valores de uma coluna específica usamos o método sort_values(), passando os nomes das colunas na ordem em que desejamos a ordenação: Ordenação por colunas: ordem alfabética de país print(dados.sort_values(by='País')) # Ordem alfabética inversa: print(dados.sort_values(by='País', ascending=False)) # Ordenação por várias colunas: ordem crescente de títulos e alfabética de países print(dados.sort_values(by=['Titulos','País'])) # Ou ainda ordem decrescente de títulos e alfabética de países # Ordenação por várias colunas print(dados.sort_values(by=['Titulos','País'], ascending = [False, True]))
Renomear colunas
É possível renomear uma ou mais colunas de um DF usando o método rename(). Para tal, passamos um mapeamento de dicionário para o parâmetro “columns” contendo pares chave:valor nos quais a chave é o nome da coluna a renomear, e o valor é o novo nome que será usado.
Por exemplo, vamos renomear a coluna “Titulos” para “Campeonatos”:
# Renomear uma coluna
dados2=dados.rename(columns = {'Titulos':'Campeonatos'})
print(dados2.columns)
Uma alternativa é usar o parâmetro axis=’columns’ ou axis=’1′:
# Renomear a coluna de volta
dados2=dados.rename({'Campeonatos':'Titulos'}, axis='columns')
print(dados2.columns)
Para alterar o nome da coluna in loco (sem criar outro df), usamos novamente o parâmetro inplace:
# Renomear coluna no DataFrame atual (inplace).
dados2.rename({'Titulos':'Campeonatos'}, axis='columns', inplace=True)
print(dados2.columns)
Para renomear múltiplas colunas o processo é o mesmo, bastando passá-las como um mapeamento de dicionário.
Por exemplo, vamos renomear as colunas “Campeonatos” e “Ano” para “Titulos” e “Primeiro_Titulo” respectivamente no df dados2:
# Renomear várias colunas de uma vez no DataFrame atual.
dados2.rename({'Campeonatos':'Titulos', 'Ano':'Primeiro_Titulo'}, axis='columns', inplace=True)
print(dados2.columns)
Também podemos renomear todas as colunas de um dataframe de uma vez, passando para isso uma lista com os novos nomes a usar. O comprimento da lista deve ser igual ao número de colunas existentes no df, e as colunas serão renomeadas na ordem em que aparecem.
Note que neste caso renomeamos as colunas SEM usar o método rename().
Por exemplo:
# Renomear colunas com lista
nomes = ['Nação','Ano_Ganhou','Qtde_Titulos']
dados2.columns = nomes
print(dados2.columns)
Renomear colunas adicionando sufixos ou prefixos
Às vezes precisamos renomear colunas adicionando sufixos ou prefixos na forma de uma sequência de caracteres. Podemos fazer isso usando os métodos add_prefix() ou add_suffix(). Por exemplo, vamos adicionar o prefixo “copa_” a todas as colunas do dataframe dados2:
# Renomear todas as colunas adicionando um prefixo
dados2 = dados2.add_prefix('copa_')
print(dados2.columns)
Leia mais aqui: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.add_prefix.html
Para remover um prefixo ou sufixo, podemos usar (entre outros) o método str.replace(), que substitui todas as ocorrências de uma determinada string por outra string (ou nenhuma string, que é o caso). Vamos remover o prefixo “copa_” adicionado anteriormente para testar:
# Remover prefixo com método str.replace
dados2.columns = dados.columns.str.replace('copa_', '')
dados2
Cuidado ao usar esse método para remover prefixos e sufixos, pois se houverem outras sequências de caracteres nos nomes das colunas iguais às que se deseja remover, estas também serão removidas, alterando de forma indesejada os nomes.
No próximo artigo estudaremos algumas técnicas de limpeza e tratamento de dados ausentes ou duplicados em um dataframe.
Colabore com a Bóson Treinamentos
Ajude o canal adquirindo meus cursos na Udemy:
- Bancos de Dados com MySQL Básico: https://bit.ly/35QdWE4
- Lógica de Programação com Português Estruturado: https://bit.ly/3QKPn22
- Programação em Python do Zero: https://bit.ly/python-boson
Adquira também livros e outros itens na loja da Bóson Treinamentos na Amazon e ajude o canal a se manter e crescer: https://www.amazon.com.br/shop/bosontreinamentos
Escreva um comentário