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:

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

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*