Como usar o objeto Series da biblioteca Pandas em Python
Como usar o objeto Series da biblioteca Pandas para análise de dados em Python
O módulo Pandas é uma biblioteca de código aberto em Python que fornece estruturas de dados e ferramentas para análise de dados eficientes e bastante flexíveis. Essa biblioteca é amplamente empregada em tarefas de manipulação, limpeza, análise e transformação de dados em projetos diversos de ciência de dados, análise de dados e engenharia de software em geral.
O Pandas possui duas estruturas de dados principais: os objetos Series e DataFrame. Neste tutorial vamos trabalhar com o objeto Series, e na próxima lição, abordaremos o objeto DataFrame.
Objeto Series
Um Series (“Série”) é um objeto do tipo array unidimensional contendo uma sequência de valores (semelhante a uma lista ou um array do NumPy) e um array associado de rótulos (labels) de dados, chamado de índice.
Ou seja, trata-se de uma estrutura de dados simples cujos valores são armazenados na forma de uma coluna de dados, porém contendo uma coluna de valores de índice associados.
Outra forma de pensar em um Series é como um dicionário ordenado de tamanho fixo, como se fosse um mapeamento entre valores de índices e valores de dados. Ele pode inclusive ser utilizada em alguns contextos em que um dicionário seria empregado.
No geral, usamos Series para guardar dados sobre um atributo em particular no dataset, sendo possível extrair uma coluna de um DataFrame na forma de um objeto Series, ou ainda adicionar uma coluna a um DataFrame a partir de um Series.
Como importar a biblioteca Pandas
Para que possamos criar e usar um objeto Series, primeiramente devemos importar o módulo Pandas (que deve estar instalado):
import pandas as pd
Caso o módulo Pandas não esteja instalado, use um gerenciador de pacotes como o pip ou conda para realizar sua instalação, como segue:
pip install pandas
ou (se estiver usando o Anaconda / Miniconda)
conda install pandas
Como criar um objeto Series
Podemos criar um objeto Series de várias maneiras, incluindo a partir de listas, dicionários, arrays NumPy e até mesmo criar Series vazias. Vejamos cada uma dessas formas com um exemplo.
Criar objeto Series vazio invocando o método Series()
# Objeto Series vazio
serie = pd.Series()
print(serie)
Criar Series a partir de uma lista comum
Uma forma mais comum é criar um objeto Series passando algum tipo de array de dados, como uma lista de valores:
# Series com lista do Python
dados = pd.Series([12, 34, 21, -9, 0, 7])
print(dados)
Saída:
0 12
1 34
2 21
3 -9
4 0
5 7
dtype: int64
Criar objeto Series a partir de um array NumPy
Podemos ainda passar um array NumPy para criar um Series (a biblioteca NumPy deve estar instalada para que o exemplo a seguir funcione):
# Series com array NumPy
import numpy as np
array_numpy = np.array([10, 20, 30, 40, 50, 60])
dados = pd.Series(array_numpy)
print(dados)
Saída:
0 10
1 20
2 30
3 40
4 50
5 60
dtype: int32
Criar Series preenchida com valores repetidos
Além disso, podemos criar um Series preenchido com um dado repetido para todos os índices:
# Series com repetição de itens
serie = pd.Series(33, index = ["num1", "num2", "num3", "num4", "num5"])
print(serie)
Saída:
num1 33
num2 33
num3 33
num4 33
num5 33
dtype: int64
Criar Series a partir de um dicionário
Finalmente, podemos criar um objeto Series passando um dicionário como parâmetro. Neste caso, as chaves serão usadas como índices e os valores serão os itens:
# Series com dicionário
dicionario = {
'Ano' :1950,
'Item' : 'TV',
'Valor' : 250.60
}
serie = pd.Series(dicionario)
print(serie)
Saída:
Ano 1950
Item TV
Valor 250.6
dtype: object
Outro exemplo de dicionário
dicionario = {'Brasil': 5, 'EUA': 0, 'Inglaterra': 1, 'Argentina': 3} dados = pd.Series(dicionario) print(dados)
Saída:
Brasil 5
EUA 0
Inglaterra 1
Argentina 3
dtype: int64
Valores e índices
A representação em string de uma Series exibida interativamente mostra o índice à esquerda e os valores à direita. Como não especificamos um índice para os dados, um índice default constituído dos inteiros de 0 a n-1 (em que n é o tamanho dos dados) é criado.
Podemos obter a representação do array e o objeto de índice de Series por meio de seus atributos de valores (values) e de índice (index), respectivamente:
print('Dados: ', dados.values)
print('Índices: ', dados.index)
Saída:
Dados: [5 0 1 3]
Índices: Index(['Brasil', 'EUA', 'Inglaterra', 'Argentina'], dtype='object')
Criar índices personalizados
Com frequência, precisamos criar um Series com um índice que identifique cada ponto de dado com um rótulo. Neste caso passamos o parâmetro index=[] contendo uma lista de valores que serão usados como índices:
dados = pd.Series([12, 34, 21, -9, 0, 7], index=['a','b','c','d','e','f']) print(dados)
Saída:
a 12
b 34
c 21
d -9
e 0
f 7
dtype: int64
Podemos usar rótulos no índice quando selecionamos valores únicos ou um conjunto de valores:
print('Dado no índice c: ', dados['c']) print('\nÍndices b e e:') print(dados[['b','e']])
Saída:
Dado no índice c: 21
Índices b e e:
b 34
e 0
dtype: int64
Operações Gerais em objetos Series
Agora que sabemos como criar e acessar objetos Series do Pandas, vamos conhecer algumas operações básicas que podemos realizar sobre os índices e dados armazenados na estrutura.
1. Acessar um item
Podemos acessar itens (valores) usando número de posição de índice ou nome de índice (se aplicado):
serie = pd.Series([10, 20, 30, 40, 50], index = ["num1", "num2","num3", "num4", "num5"]) print('Item na posição 0: ', serie[0]) print('Item de índice num3: ', serie['num3'])
Saída:
Item na posição 0: 10
Item de índice num3: 30
2. Descobrir valores máximo e mínimo
Podemos retornar os valores máximo e mínimo de um objeto Series com o emprego dos métodos .max() e .min():
serie = pd.Series([5, 7, 12, 2, 1, 6, 7, 0, -3, 22]) print(f'Menor valor: {serie.min()}') print(f'Valor mais alto: {serie.max()}')
Saída:
Menor valor: -3
Valor mais alto: 22
Para obter o índice associado ao maior valor usamos o método .idxmax() e o índice do menor valor com .idxmin():
serie = pd.Series([5, 7, 12, 2, 1, 6, 7, 0, -3, 22]) print(f'Valor mais alto: {serie.max()}') print(f'Índice do maior valor: {serie.idxmax()}') print(f'Índice do menor valor: {serie.idxmin()}')
Saída:
Valor mais alto: 22
Índice do maior valor: 9
Índice do menor valor: 8
3. Funções de Estatística Descritiva
Diversas funções de estatística descritiva estão disponíveis em objetos Series, na forma de métodos associados, como Média Aritmética Simples, Mediana e Somatório, entre outras.
A média aritmética pode ser obtida com o método .mean():
print(f'Média aritmética: {serie.mean()}')
Saída:
Média aritmética: 5.9
A mediana com .median():
print(f'Mediana dos valores: {serie.median()}')
Saída:
Mediana dos valores: 5.5
E o somatório dos valores com .sum():
print(f'Somatório dos valores: {serie.sum()}')
Saída:
Somatório dos valores: 59
4. Converter objeto Series em lista comum do Python
Podemos converter um objeto Series em uma lista comum do Python com o método .tolist():
serie = pd.Series([5, 7, 12, 2, 1, 6, 7, 0, -3, 22]) # Ver objeto Series print(serie) # Criar lista a partir de Series lista = serie.tolist() # Ver lista criada print('Lista: ', lista)
Saída:
0 5
1 7
2 12
3 2
4 1
5 6
6 7
7 0
8 -3
9 22
dtype: int64
Lista: [5, 7, 12, 2, 1, 6, 7, 0, -3, 22]
5. Mostrar apenas os primeiros e últimos itens da Series
Se a quantidade de itens no objeto Series for grande, talvez você queira ver apenas os primeiros valores para ter uma ideia da natureza dos dados. Neste caso, pode usar o método head(), que retorna os cinco primeiros itens da série.
print(serie.head())
Saída:
0 5
1 7
2 12
3 2
4 1
dtype: int64
Da mesma forma, para mostrar os cinco últimos elementos, usamos o método .tail()
Dependendo da quantidade de itens, o Pandas retorna automaticamente apenas os cinco primeiros e os cinco últimos, sem a necessidade de usar o método .head().
No exemplo a seguir geramos 1000 números aleatórios usando a biblioteca NumPy, e criamos um Series do Pandas com esses valores. Na sequência, imprimimos os valores na tela – somente os cinco primeiros e cinco últimos devem aparecer neste caso, mesmo sem usar os métodos head() e tail():
import pandas as pd from numpy import random lista = [] for i in range(1000): lista.append(random.randint(250)) dados = pd.Series(lista) print(dados)
Saída:
0 0
1 39
2 161
3 125
4 147
...
995 24
996 95
997 165
998 144
999 45
Length: 1000, dtype: int64
6. Mostrar os elementos ordenados por valores de índice: método .sort_index()
dicionario = {'Brasil': 5, 'EUA': 0, 'Inglaterra': 1, 'Argentina': 3} dados = pd.Series(dicionario) print(dados.sort_index())
Saída:
Argentina 3
Brasil 5
EUA 0
Inglaterra 1
dtype: int64
7. Mostrar os elementos ordenados por valores dos itens: método .sort_values()
dicionario = {'Brasil': 5, 'EUA': 0, 'Inglaterra': 1, 'Argentina': 3} dados = pd.Series(dicionario) print(dados.sort_values())
Saída:
EUA 0
Inglaterra 1
Argentina 3
Brasil 5
dtype: int64
Vamos praticar um pouco agora.
Dataset para exercícios
Escreva um código que gere um objeto Series do Pandas, contendo uma lista com todos os países da União Europeia e suas respectivas populações, com os nomes dos países sendo usados como índices.
# Dicionário contendo os países da União Europeia e suas populações dados = { 'Austria': 9006398, 'Alemanha': 83289318, 'Bélgica': 11589623, 'Bulgária': 7000039, 'Chipre': 1207361, 'Croácia': 4076246, 'Dinamarca': 5806015, 'Eslováquia': 5459642, 'Eslovênia': 2095861, 'Espanha': 47351567, 'Estônia': 1324820, 'Finlândia': 5523231, 'França': 66977107, 'Grécia': 10423056, 'Hungria': 9775564, 'Irlanda': 4882495, 'Itália': 60233948, 'Letônia': 1906743, 'Lituânia': 2793471, 'Luxemburgo': 613894, 'Malta': 493559, 'Países Baixos': 17134872, 'Polônia': 37974750, 'Portugal': 10286263, 'República Tcheca': 10693939, 'Romênia': 19405156, 'Suécia': 10106005, } # Criar um objeto Series a partir do dicionário populacao_ue = pd.Series(dados) # Exibir o objeto Series print(populacao_ue)
Exercícios: Series do Pandas
Vamos treinar agora. Para os próximos exercícios, use o Series populacao_ue criado anteriormente. As respostas estão na sequência, com códigos sugeridos.
01. Imprimir a população da França.
02. Imprimir a lista de países da União Europeia em ordem alfabética.
03. Calcular e imprimir o número total de países na União Europeia.
04. Calcular e imprimir a população média dos países da União Europeia. Mostrar o resultado com duas casas decimais apenas.
05. Encontrar e imprimir o país com a maior população na União Europeia.
06. Filtrar e imprimir os países da União Europeia com população acima de 10 milhões, mostrando o resultado em ordem alfabética de nome de país.
07. Calcular e imprimir a população total da União Europeia.
08. Calcular e imprimir a porcentagem da população da Espanha em relação à população total da União Europeia.
09. Ordenar a Series em ordem decrescente de população e imprimir os cinco primeiros países.
10. Criar uma nova Series com a população de apenas três países da União Europeia e calcular a média da população desses países.
Use como exemplos os países França, Alemanha e Croácia.
11. Como exibir apenas as últimas três linhas do Series Pandas de nome “populacao_ue”?
A. populacao_ue(3:)
B. populacao_ue(1:3)
C. populacao_ue(-3:)
D. populacao_ue(:3)
E. populacao_ue(+3)
12. Podemos criar um objeto Series do Pandas usando:
A. Array NumPy
B. Lista
C. Dicionário
D. Valores repetidos
E. Todos os anteriores
RESPOSTAS DOS EXERCÍCIOS
01.
print(populacao_ue['França'])
02.
print(populacao_ue.sort_index())
03.
numero_paises = len(populacao_ue.index) print("Número de países na União Europeia:", numero_paises)
04.
populacao_media = populacao_ue.mean() print(f'População média dos países da União Europeia: {round(populacao_media, 2)}')
05.
pais_maior_populacao = populacao_ue.idxmax() print("País com maior população na União Europeia:", pais_maior_populacao)
06.
# Filtrar os países da União Europeia com população acima de 10 milhões paises_mais_10M = populacao_ue[populacao_ue > 10000000] # Ordenar os países filtrados em ordem alfabética e imprimir paises_ordenados = paises_mais_10M.sort_index() print("Países da União Europeia com população acima de 10 milhões, em ordem alfabética:") print(paises_ordenados)
07.
print(f'População total da União Europeia: {populacao_ue.sum()} habitantes')
08.
populacao_espanha = populacao_ue['Espanha'] populacao_total = populacao_ue.sum() porcentagem_espanha = (populacao_espanha / populacao_total) * 100 print(f'População da Espanha em relação à população da UE: {porcentagem_espanha:.02f}%')
09.
paises_mais_populosos = populacao_ue.sort_values(ascending=False) print("Cinco primeiros países mais populosos:") print(paises_mais_populosos.head())
10.
paises_selecionados = populacao_ue[['França', 'Alemanha', 'Croácia']] media_populacao_selecionados = paises_selecionados.mean() print("Média da população:", media_populacao_selecionados)
11.
C. populacao_ue(-3:)
12.
E. Todos os anteriores
É isso aí! No próximo tutorial vamos apresentar o objeto DataFrame (df) do Pandas, mostrando como criar um dataframe e como manipular seu conteúdo pode meio dos métodos e propriedades disponíveis.
Escreva um comentário