
Pandas é uma biblioteca Python muito popular para análise e manipulação de dados, pois fornece funções e estruturas que são poderosas para lidar com os dados em sua forma tabular. Recentemente nós fizemos um artigo fornecendo uma visão geral e introdutória da biblioteca, neste link, que obteve bastante audiência. Já que gostaram do assunto resolvemos então prosseguir com mais algumas postagens sobre Pandas e suas estruturas de dados.
As duas estruturas de dados principais que a biblioteca utiliza são: DataFrame e Series. O DataFrame é uma estrutura bidimensional com linhas e colunas nomeadas, similar a uma tabela SQL. Já a estrutura Series, foco do nosso artigo, é um array nomeado e unidimensional. As chaves (nomes) dos valores no Series são referenciados como index, e ambas as estruturas são capazes de armazenar qualquer tipo de dados (inteiro, string, float, objetos, etc.).
Neste artigo iremos mostrar alguns exemplos de operações que podem ser feitas utilizando a estrutura de dados Series do Pandas.
1. Um DataFrame é composto por Series
Uma linha ou coluna individual do DataFrame é na verdade um Series.
import pandas as pd
dados = [[1, 12, 7],
[3, 8, 21],
[4, 5, 15]]
df = pd.DataFrame(dados)
linha = df.iloc[0, :]
print(type(linha))
> pandas.core.series.Series
coluna = df[0]
print(type(coluna))
> pandas.core.series.Series
2. Series é composto por chave (index) e valor
Como mencionado antes, o Series é um array nomeado, ou seja, podemos acessar os valores, e as chaves, que são referenciadas como index.
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'd', 'e'])
print(ser.index)
> RangeIndex(start=0, stop=5, step=1)
print(ser.values)
> ['a', 'b', 'c', 'd', 'e']
3. As chaves são customizáveis
No exemplo acima vimos que foi atribuído um index inteiro, começando de zero, para cada valor do array Series. Este é o comportamento padrão, porém podemos mudá-lo usando o parâmetro index.
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'd', 'e'], index=[10, 20, 30, 40, 50])
print(ser.index)
> Int64Index([10, 20, 30, 40, 50], dtype='int64')
4. Criação de Series por lista, dicionário ou NumPy array
Um array Series pode ser criado a partir de uma lista, um dicionário ou mesmo um NumPy array.
import pandas as pd
import numpy as np
lista = ['data', 'science', 'machine', 'learning']
ser = pd.Series(lista)
print(ser)
> 0 data
1 science
2 machine
3 learning
dtype: object
dicionario = {
'a': 'data', 'b': 'science', 'c': 'machine', 'd': 'learning'
}
ser = pd.Series(dicionario)
print(ser)
> a data
b science
c machine
d learning
dtype: object
arr = np.random.randint(0, 10, size=5)
ser = pd.Series(arr)
print(ser)
> 0 2
1 8
2 1
3 9
4 8
dtype: int64
5. Acessando valores individuais
Podemos acessar um valor específico do array Series utilizando a chave associada e ele.
import pandas as pd
ser = pd.Series(['a', 'b', 'c', 'd', 'e'])
print(ser[0])
> a
print(ser[2])
> c
ser = pd.Series({'a': 'data', 'b': 'science'})
print(ser['a'])
> data
6. Tipo dos dados
Pandas associa um tipo de dado para os valores do Series quando ele é criado, mas nós podemos alterar esse tipo usando o parâmetro dtype.
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5])
print(ser)
> 0 1
1 2
2 3
3 4
4 5
dtype: int64
ser = pd.Series([1, 2, 3, 4, 5], dtype='float')
print(ser)
> 0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
dtype: float64
7. Unique e Nunique
As funções unique e nunique retornam os valores únicos e a quantidade de valores únicos em um array Series, respectivamente.
import pandas as pd
ser = pd.Series(['a', 'a', 'a', 'b', 'b', 'c'])
print(ser.unique())
> ['a', 'b', 'c']
print(ser.nunique())
> 3
8. Maiores e menores valores
As funções nlargest e nsmallest retornam os maiores e menores valores de um array Series, respectivamente. O comportamento padrão é que sejam retornados os 5 maiores ou menores valores, mas podemos alterar esse número passando o parâmetro n para as funções.
import pandas as pd
ser = pd.Series([101, 223, 7, 87, 51, 3, 11, 9])
print(ser.nlargest(n=3))
> 1 223
0 101
3 87
dtype: int64
print(ser.nsmallest(n=2))
> 5 3
2 7
dtype: int64
9. Número de ocorrências de determinado valor
A função value_counts retorna o número de ocorrências de cada valor no array Series e é muito útil para ter uma visão geral da distribuição dos valores.
import pandas as pd
ser = pd.Series(['a', 'a', 'a', 'b', 'b', 'c'])
print(ser.value_counts())
> a 3
b 2
c 1
dtype: int64
10. Valores null
Pandas torna simples detectar os valores de tipo null. A função isna retorna um array com valores booleanos indicando para cada index onde existem valores que são nulos.
import pandas as pd
import numpy as np
ser = pd.Series([1, 2, 3, np.nan, np.nan])
print(ser.isna())
> 0 False
1 False
2 False
3 True
4 True
dtype: bool
Nós também podemos contar a quantidade de nulos usando a função sum associada a função isna.
print(ser.isna().sum())
> 2
Além disso, a função count quando chamada retorna apenas a quantidade de valores que são não nulos em um Series.
print(ser.count())
> 3
11. Operações lógicas
É possível aplicar operações lógicas, como maior que, menor que e igualdade em um array Series de forma fácil.
import pandas as pd
ser = pd.Series([1, 2, 3, 4])
print(ser.eq(3))
> 0 False
1 False
2 True
3 False
dtype: bool
print(ser.gt(2))
> 0 False
1 False
2 True
3 True
dtype: bool
12. Operações de agregação
Podemos aplicar funções de agregação como soma, média, mediana e etc. Uma forma de fazer isso é usando a função separadamente.
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 10])
print(ser.mean())
> 4.0
E caso seja necessário aplicar múltiplas funções de agregação podemos passar uma lista com todas elas para a função agg.
print(ser.agg(['mean', 'median', 'sum', 'count']))
> mean 4.0
median 3.0
sum 20.0
count 5.0
dtype: float64
Conclusão
O objetivo do artigo foi fornecer uma ideia geral e introdutória de como lidar com a estrutura de dados Series, existem é claro, mais funções e aplicações a serem exploradas. Você pode ir aprendendo operações mais avançadas e específicas conforme for necessário. Enfim, espero ter ajudado de alguma forma com estes 12 exemplos práticos. Deixe nos comentários se seria interessante um novo artigo sobre Pandas, que tal falarmos sobre o DataFrame em uma próxima? Deixe o seu feedback, abraços e até mais!