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.

 

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.

Escreva um comentário

Seu e-mail não será divulgado


*