Pós-Graduação: Especialização em Data Science & Big Data

Pontifícia Universidade Católica de Minas Gerais (PUC-MG)

Victor Hugo Negrisoli - Linguagens de Programação Para Ciência de Dados

Introdução ao Pandas - Series

In [144]:
import pandas as pd
import numpy as np
import pickle
In [7]:
# Criando um objeto Series do Pandas

idades = [15, 24, 88, 75, 34, 23]
serie_idades = pd.Series(idades)
serie_idades
Out[7]:
0    15
1    24
2    88
3    75
4    34
5    23
dtype: int64
In [13]:
# Criando um objeto Series do Pandas utilizando 2 listas

pessoas = ['Eni', 'Bia', 'Flávio', 'Carlos', 'Dedé', 'Abigail']
serie_idades_pessoas = pd.Series(idades, pessoas)
serie_idades_pessoas
Out[13]:
Eni        15
Bia        24
Flávio     88
Carlos     75
Dedé       34
Abigail    23
dtype: int64
In [17]:
# Recuperando itens

print(serie_idades[1])
print(serie_idades_pessoas[2])
print(serie_idades_pessoas['Flávio'])
24
88
88
In [20]:
# Criando uma série a partir de uma Tupla

estados = ("Mnas Gerais", "Amazonas", "Maranhão", "Goiás", "Santa Catarina")
siglas = ("MG", "AM", "MA", "GO", "SC")
serie_estados = pd.Series(estados, siglas)
serie_estados
Out[20]:
MG       Mnas Gerais
AM          Amazonas
MA          Maranhão
GO             Goiás
SC    Santa Catarina
dtype: object
In [22]:
# Alterando os dados de uma série. Ex: Minas Gerais (estava como Mnas Gerais)

serie_estados["MG"] = "Minas Gerais"
serie_estados
Out[22]:
MG      Minas Gerais
AM          Amazonas
MA          Maranhão
GO             Goiás
SC    Santa Catarina
dtype: object
In [24]:
# Criando séries a partir de Arrays NumPy

precos = np.array([25, 22, 18.5, 4.75, 3, 4.5, 2.3])
lanches = np.array(['X-tudo', 'X-Bacon', 'Bauru', 'Misto-quente', 'Pão-de-queijo', 'Coxinha', 'Pastel'])
series_lanches_precos = pd.Series(precos, lanches)
series_lanches_precos
Out[24]:
X-tudo           25.00
X-Bacon          22.00
Bauru            18.50
Misto-quente      4.75
Pão-de-queijo     3.00
Coxinha           4.50
Pastel            2.30
dtype: float64
In [26]:
# Criando séries a partir de dicionários

dic_estados = {"MG": "Minas Gerais", "CE": "Ceará", "MT": "Mato Grosso", "RR": "Roraima"}
series_estados_1 = pd.Series(dic_estados)
series_estados_1
Out[26]:
MG    Minas Gerais
CE           Ceará
MT     Mato Grosso
RR         Roraima
dtype: object
In [27]:
dic_estados_2 = {"MG": {"Estado":"Minas Gerais", "Capital":"Belo Horizonte", "População (2014)":20777672}, 
               "CE": {"Estado":"Ceará", "Capital":"Fortaleza", "População (2014)":8867448},
               "MT": {"Estado":"Mato Grosso", "Capital":"Cuiabá", "População (2014)":3236578},
               "RR": {"Estado":"Roraima", "Capital":"Boa Vista", "População (2014)":500826},}
series_estados_2 = pd.Series(dic_estados_2)
series_estados_2
Out[27]:
MG    {'Estado': 'Minas Gerais', 'Capital': 'Belo Ho...
CE    {'Estado': 'Ceará', 'Capital': 'Fortaleza', 'P...
MT    {'Estado': 'Mato Grosso', 'Capital': 'Cuiabá',...
RR    {'Estado': 'Roraima', 'Capital': 'Boa Vista', ...
dtype: object
In [28]:
print(series_estados_2["MG"])
{'Estado': 'Minas Gerais', 'Capital': 'Belo Horizonte', 'População (2014)': 20777672}
In [29]:
print(series_estados_2["MG"]["Estado"])
Minas Gerais
In [30]:
print(series_estados_2["MG"]["Capital"])
Belo Horizonte
In [35]:
# Criando Series a partir de arquivos CSV

idades = pd.read_csv('dados/idades.csv')
idades.head()
Out[35]:
Idades
0 55
1 45
2 74
3 18
4 21
In [37]:
type(idades)
Out[37]:
pandas.core.frame.DataFrame
In [40]:
# Recuperando os dados (pois está no formato DataFrame)

idades["Idades"][3]
Out[40]:
18
In [41]:
# O parâmetro squeeze (default False) irá retorna um formato Series caso os dados do CSV possuam apenas uma coluna

idades = pd.read_csv('dados/idades.csv', squeeze = True)
idades.head()
Out[41]:
0    55
1    45
2    74
3    18
4    21
Name: Idades, dtype: int64
In [42]:
type(idades)
Out[42]:
pandas.core.series.Series
In [43]:
idades[4]
Out[43]:
21
In [45]:
# Lendo o arquivo idades2.csv, que agora possuem 2 colunas 

idades_2 = pd.read_csv('dados/idades2.csv', squeeze = True)
idades_2
Out[45]:
Nome Idade
0 Agatha 24
1 Alice 27
2 Alícia 18
3 Amanda 18
4 Ana Beatriz 44
... ... ...
95 Valentina 54
96 Vinicius 32
97 Vitor 41
98 Vitória 49
99 Yasmin 52

100 rows × 2 columns

In [46]:
# Para termos um objeto Series, teremos que definir um das colunas para o índice

idades_2 = pd.read_csv('dados/idades2.csv', squeeze = True, index_col = 0)
idades_2
Out[46]:
Nome
Agatha         24
Alice          27
Alícia         18
Amanda         18
Ana Beatriz    44
               ..
Valentina      54
Vinicius       32
Vitor          41
Vitória        49
Yasmin         52
Name: Idade, Length: 100, dtype: int64
In [47]:
type(idades_2)
Out[47]:
pandas.core.series.Series
In [48]:
# Lendo de um arquivo XLSX (Excel) sem informar qual a planilha aberta. Por padrão, sempre abre a primeira planilha

idades_xlsx = pd.read_excel('dados/idades2.xlsx', squeeze = True)
idades_xlsx
Out[48]:
0     55
1     45
2     74
3     18
4     21
      ..
95    37
96    19
97    53
98    36
99    60
Name: Idades, Length: 100, dtype: int64
In [49]:
type(idades_xlsx)
Out[49]:
pandas.core.series.Series
In [50]:
# Criando uma Series informando a Planilha (no caso, queremos a segunda)

idades_xslx_2 = pd.read_excel('dados/idades2.xlsx', squeeze = True, sheet_name = "Planilha2")
idades_xslx_2
Out[50]:
Nome Idade
0 Agatha 24
1 Alice 27
2 Alícia 18
3 Amanda 18
4 Ana Beatriz 44
... ... ...
95 Valentina 54
96 Vinicius 32
97 Vitor 41
98 Vitória 49
99 Yasmin 52

100 rows × 2 columns

In [51]:
type(idades_xslx_2)
Out[51]:
pandas.core.frame.DataFrame
In [52]:
# Vamos recriar a planilha acima, porém, indicando a coluna de índice para criar um objeto Series ao invés de DataFrame

idades_xslx_2 = pd.read_excel('dados/idades2.xlsx', squeeze = True, sheet_name = "Planilha2", index_col = 0)
idades_xslx_2
Out[52]:
Nome
Agatha         24
Alice          27
Alícia         18
Amanda         18
Ana Beatriz    44
               ..
Valentina      54
Vinicius       32
Vitor          41
Vitória        49
Yasmin         52
Name: Idade, Length: 100, dtype: int64
In [53]:
type(idades_xslx_2)
Out[53]:
pandas.core.series.Series
In [54]:
# Atributos do objeto Series

idades_xslx_2.dtype
Out[54]:
dtype('int64')
In [55]:
idades_xslx_2.name
Out[55]:
'Idade'
In [56]:
idades_xslx_2.nbytes
Out[56]:
800
In [57]:
idades_xslx_2.index
Out[57]:
Index(['Agatha', 'Alice', 'Alícia', 'Amanda', 'Ana Beatriz', 'Ana Clara',
       'Ana Julia', 'Ana Luiza', 'Antônio', 'Arthur', 'Beatriz', 'Benjamin',
       'Bernardo', 'Bianca', 'Bruno', 'Bryan', 'Caio', 'Carolina', 'Catarina',
       'Cauã', 'Cecília', 'Clara', 'Daniel', 'Davi', 'Davi Lucas', 'Davi Luiz',
       'Eduardo', 'Emanuel', 'Emanuelly', 'Enzo', 'Enzo Gabriel', 'Esther',
       'Felipe', 'Fernanda', 'Francisco', 'Gabriel', 'Gabriela', 'Gabrielly',
       'Giovanna', 'Guilherme', 'Gustavo', 'Heitor', 'Helena', 'Heloísa',
       'Henrique', 'Ian', 'Isaac', 'Isabella', 'Isabelly', 'Isadora', 'João',
       'João Gabriel', 'João Miguel', 'João Pedro', 'João Vitor', 'Joaquim',
       'Julia', 'Lara', 'Larissa', 'Laura', 'Lavínia', 'Leonardo', 'Letícia',
       'Lívia', 'Lorena', 'Lorenzo', 'Lucas', 'Lucca', 'Luiza', 'Manuela',
       'Maria Clara', 'Maria Eduarda', 'Maria Fernanda', 'Maria Luiza',
       'Mariana', 'Marina', 'Matheus', 'Melissa', 'Miguel', 'Murilo',
       'Nicolas', 'Nicole', 'Otávio', 'Pedro', 'Pedro Henrique', 'Pietro',
       'Rafael', 'Rafaela', 'Rebeca', 'Rodrigo', 'Samuel', 'Sarah', 'Sofia',
       'Theo', 'Thiago', 'Valentina', 'Vinicius', 'Vitor', 'Vitória',
       'Yasmin'],
      dtype='object', name='Nome')
In [59]:
idades_xslx_2.ndim
Out[59]:
1
In [60]:
idades_xslx_2.size
Out[60]:
100
In [62]:
idades_xslx_2.shape
Out[62]:
(100,)
In [63]:
idades_xslx_2.values
Out[63]:
array([24, 27, 18, 18, 44, 46, 49, 47, 47, 41, 27, 19, 18, 25, 31, 42, 23,
       39, 21, 27, 21, 25, 19, 33, 25, 45, 49, 46, 34, 33, 43, 23, 29, 39,
       34, 33, 31, 39, 49, 36, 24, 40, 32, 18, 22, 48, 52, 24, 24, 34, 29,
       52, 33, 36, 41, 22, 21, 47, 42, 51, 31, 25, 31, 41, 43, 34, 55, 53,
       51, 23, 44, 32, 18, 26, 29, 33, 39, 36, 47, 44, 27, 31, 52, 29, 34,
       47, 49, 33, 29, 19, 52, 44, 48, 42, 47, 54, 32, 41, 49, 52],
      dtype=int64)
Indexação e iteração do objeto Series
In [67]:
series_lanches_precos
Out[67]:
X-tudo           25.00
X-Bacon          22.00
Bauru            18.50
Misto-quente      4.75
Pão-de-queijo     3.00
Coxinha           4.50
Pastel            2.30
dtype: float64
In [68]:
# Método at[] para localizar itens pelo rótulo

series_lanches_precos.at["X-tudo"]
Out[68]:
25.0
In [69]:
# Método iat[] para retornar itens pelo índice

series_lanches_precos.iat[0]
Out[69]:
25.0
In [70]:
# É possível também alterar o valor usando at e iat

series_lanches_precos.at["X-tudo"] = 27
series_lanches_precos.iat[1] = 35
series_lanches_precos
Out[70]:
X-tudo           27.00
X-Bacon          35.00
Bauru            18.50
Misto-quente      4.75
Pão-de-queijo     3.00
Coxinha           4.50
Pastel            2.30
dtype: float64
In [71]:
# Método get() também retorna valor, mas não altera dados

series_lanches_precos.get(0)
Out[71]:
27.0
In [72]:
# O método loc irá permitir o acesso a mais de um rótulo

series_lanches_precos.loc[["X-tudo", "Pastel"]]
Out[72]:
X-tudo    27.0
Pastel     2.3
dtype: float64
In [73]:
# O método iloc irá permitir o acesso a mais de um índice

series_lanches_precos.iloc[[0, 2, 4]]
Out[73]:
X-tudo           27.0
Bauru            18.5
Pão-de-queijo     3.0
dtype: float64
In [75]:
# O método keys() nos retornará as chaves ou rótulos

series_lanches_precos.keys()
Out[75]:
Index(['X-tudo', 'X-Bacon', 'Bauru', 'Misto-quente', 'Pão-de-queijo',
       'Coxinha', 'Pastel'],
      dtype='object')
Métodos matemáticos e estatísticos do Series
In [76]:
a = pd.Series([4, 8, 2, 5, 7])
b = pd.Series([1, 2, 3, 4, 5])
In [91]:
c = a.add(b)
c
Out[91]:
0     5
1    10
2     5
3     9
4    12
dtype: int64
In [92]:
a2 = a.add(5)
a2
Out[92]:
0     9
1    13
2     7
3    10
4    12
dtype: int64
In [93]:
a3 = a.sub(4)
a3
Out[93]:
0    0
1    4
2   -2
3    1
4    3
dtype: int64
In [94]:
a4 = a.div(3)
a4
Out[94]:
0    1.333333
1    2.666667
2    0.666667
3    1.666667
4    2.333333
dtype: float64
In [95]:
a.mean()
Out[95]:
5.2
In [96]:
a.sum()
Out[96]:
26
In [97]:
a.std()
Out[97]:
2.3874672772626644
In [98]:
a.describe()
Out[98]:
count    5.000000
mean     5.200000
std      2.387467
min      2.000000
25%      4.000000
50%      5.000000
75%      7.000000
max      8.000000
dtype: float64
In [99]:
a.max()
Out[99]:
8
In [100]:
a.min()
Out[100]:
2
In [102]:
# Utilizando o método round() para arredondar os valores

a = pd.Series(np.random.randint(0, 100, 10)).pow(1/2)
a
Out[102]:
0    7.745967
1    5.000000
2    8.062258
3    8.426150
4    6.403124
5    1.732051
6    1.732051
7    9.486833
8    5.291503
9    9.219544
dtype: float64
In [104]:
a = a.round(2)
a
Out[104]:
0    7.75
1    5.00
2    8.06
3    8.43
4    6.40
5    1.73
6    1.73
7    9.49
8    5.29
9    9.22
dtype: float64
In [106]:
a = a.round(0)
a
Out[106]:
0    8.0
1    5.0
2    8.0
3    8.0
4    6.0
5    2.0
6    2.0
7    9.0
8    5.0
9    9.0
dtype: float64
Métodos booleanos lt (menor que), gt (maior que), le (menor ou igual), ge (maior ou igual), ne (diferente) e eq (igual)
In [109]:
b.lt(a)
Out[109]:
0     True
1     True
2     True
3     True
4     True
5    False
6    False
7    False
8    False
9    False
dtype: bool
In [111]:
a.gt(b)
Out[111]:
0     True
1     True
2     True
3     True
4     True
5    False
6    False
7    False
8    False
9    False
dtype: bool
In [112]:
b.le(a)
Out[112]:
0     True
1     True
2     True
3     True
4     True
5    False
6    False
7    False
8    False
9    False
dtype: bool
In [113]:
a.ge(b)
Out[113]:
0     True
1     True
2     True
3     True
4     True
5    False
6    False
7    False
8    False
9    False
dtype: bool
In [115]:
b.ne(a)
Out[115]:
0    True
1    True
2    True
3    True
4    True
5    True
6    True
7    True
8    True
9    True
dtype: bool
In [117]:
a.eq(b)
Out[117]:
0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool
In [119]:
# Métodos sum, abs e product

a.sum()
Out[119]:
62.0
In [120]:
a.product()
Out[120]:
24883200.0
In [126]:
# Método abs() para números absolutos, vamos criar um Series com números positivos e negativos

a = pd.Series(np.arange(-6, 6, 2))
a
Out[126]:
0   -6
1   -4
2   -2
3    0
4    2
5    4
dtype: int32
In [127]:
# O resultado são todos os números absolutos

a.abs()
Out[127]:
0    6
1    4
2    2
3    0
4    2
5    4
dtype: int32
In [128]:
# Calculando o quartil, os N maiores ou N melhores

a.quantile(.25)
Out[128]:
-3.5
In [129]:
a.quantile(.5)
Out[129]:
-1.0
In [130]:
a.quantile(.75)
Out[130]:
1.5
In [131]:
a.nsmallest(3)
Out[131]:
0   -6
1   -4
2   -2
dtype: int32
In [132]:
a.nlargest(3)
Out[132]:
5    4
4    2
3    0
dtype: int32
In [133]:
a.unique()
Out[133]:
array([-6, -4, -2,  0,  2,  4], dtype=int64)
In [134]:
a.nunique()
Out[134]:
6
In [135]:
np.sort(a.unique())
Out[135]:
array([-6, -4, -2,  0,  2,  4], dtype=int64)
In [136]:
# O método count() sempre contará a qunatidade de elementos não nulos

a.count()
Out[136]:
6
In [137]:
b = pd.Series([2, 5, np.nan, 0, 3, None, 6])
b
Out[137]:
0    2.0
1    5.0
2    NaN
3    0.0
4    3.0
5    NaN
6    6.0
dtype: float64
In [139]:
b.count()
Out[139]:
5
Métodos de manipulação e seleção do Series
In [140]:
series_estados_2
Out[140]:
MG    {'Estado': 'Minas Gerais', 'Capital': 'Belo Ho...
CE    {'Estado': 'Ceará', 'Capital': 'Fortaleza', 'P...
MT    {'Estado': 'Mato Grosso', 'Capital': 'Cuiabá',...
RR    {'Estado': 'Roraima', 'Capital': 'Boa Vista', ...
dtype: object
In [141]:
# Utilizando o shallow copy()

copia = series_estados_2.copy()
copia
Out[141]:
MG    {'Estado': 'Minas Gerais', 'Capital': 'Belo Ho...
CE    {'Estado': 'Ceará', 'Capital': 'Fortaleza', 'P...
MT    {'Estado': 'Mato Grosso', 'Capital': 'Cuiabá',...
RR    {'Estado': 'Roraima', 'Capital': 'Boa Vista', ...
dtype: object
In [143]:
# Verificando que, mesmo com shallow copy(), a alteração irá refletir em ambas as Séries, pois a shallow copy
# é uma cópia superficial, apenas a referência da memória do objeto

copia["MT"]["Capital"] = "São Paulo"
print(series_estados_2["MT"]["Capital"])
print(copia["MT"]["Capital"])
São Paulo
São Paulo
In [149]:
# Realizando uma deep copy, ou seja, uma cópia profunda dos dados da Series utilizando a biblioteca Pickle

# Voltando os dados ao estado original

series_estados_2["MT"]["Capital"] = "Cuiabá"
copia["MT"]["Capital"] = "Cuiabá"
In [150]:
# Criando a cópia da Series usando o Pickle

copia_profunda = pickle.loads(pickle.dumps(series_estados_2))
copia_profunda
Out[150]:
MG    {'Estado': 'Minas Gerais', 'Capital': 'Belo Ho...
CE    {'Estado': 'Ceará', 'Capital': 'Fortaleza', 'P...
MT    {'Estado': 'Mato Grosso', 'Capital': 'Cuiabá',...
RR    {'Estado': 'Roraima', 'Capital': 'Boa Vista', ...
dtype: object
In [151]:
# Agora, ao alterar a Series copia, a series_estados_2 continuará em seu estado original

copia_profunda["MT"]["Capital"] = "São Paulo"

print(series_estados_2["MT"]["Capital"])
print(copia_profunda["MT"]["Capital"])
Cuiabá
São Paulo
In [152]:
# Concatenação de Series com append()

a
Out[152]:
0   -6
1   -4
2   -2
3    0
4    2
5    4
dtype: int32
In [153]:
b
Out[153]:
0    2.0
1    5.0
2    NaN
3    0.0
4    3.0
5    NaN
6    6.0
dtype: float64
In [156]:
# Os índices são relacionados a cada série concatenada

ab = a.append(b)
ab
Out[156]:
0   -6.0
1   -4.0
2   -2.0
3    0.0
4    2.0
5    4.0
0    2.0
1    5.0
2    NaN
3    0.0
4    3.0
5    NaN
6    6.0
dtype: float64
In [157]:
# Realizando uma concatenação, porém, ignorando os índices das séries a e b, ou seja, será de 0 até o máximo

ab = a.append(b, ignore_index = True)
ab
Out[157]:
0    -6.0
1    -4.0
2    -2.0
3     0.0
4     2.0
5     4.0
6     2.0
7     5.0
8     NaN
9     0.0
10    3.0
11    NaN
12    6.0
dtype: float64
In [159]:
# Substituindo dados com replace

c = ab.replace(0, 1)
c
Out[159]:
0    -6.0
1    -4.0
2    -2.0
3     1.0
4     2.0
5     4.0
6     2.0
7     5.0
8     NaN
9     1.0
10    3.0
11    NaN
12    6.0
dtype: float64
In [160]:
# Utilizando o método update() para atualizar os dados de uma Series

d = pd.Series([4, 10, 11, 12], index=[9, 7, 10, 4])
d
Out[160]:
9      4
7     10
10    11
4     12
dtype: int64
In [163]:
# Os dados dos índices 9, 7, 10 e 4 foram substituídos pelos dados da Series d

c.update(d)
c
Out[163]:
0     -6.0
1     -4.0
2     -2.0
3      1.0
4     12.0
5      4.0
6      2.0
7     10.0
8      NaN
9      4.0
10    11.0
11     NaN
12     6.0
dtype: float64
In [169]:
# Head, tail e sample

c.head(4)
Out[169]:
0   -6.0
1   -4.0
2   -2.0
3    1.0
dtype: float64
In [170]:
c.tail(3)
Out[170]:
10    11.0
11     NaN
12     6.0
dtype: float64
In [171]:
c.sample()
Out[171]:
12    6.0
dtype: float64
In [172]:
c.sample(4)
Out[172]:
1     -4.0
11     NaN
7     10.0
12     6.0
dtype: float64
Utilizando métodos where e mask
In [173]:
c = (a.append(b, ignore_index = True)).replace(np.nan, -1)
c
Out[173]:
0    -6.0
1    -4.0
2    -2.0
3     0.0
4     2.0
5     4.0
6     2.0
7     5.0
8    -1.0
9     0.0
10    3.0
11   -1.0
12    6.0
dtype: float64
In [174]:
# Criando listas usando o where. Sempre troca o valor quando a condição é falsa

d = c.where(c > 3, 10) # Se c > 3, então mantém, senão, o valor será substituído por 10
e = c.where(c <= 3, 0) # Se c <= 3, mantém, senão, será 0
In [175]:
d
Out[175]:
0     10.0
1     10.0
2     10.0
3     10.0
4     10.0
5      4.0
6     10.0
7      5.0
8     10.0
9     10.0
10    10.0
11    10.0
12     6.0
dtype: float64
In [176]:
e
Out[176]:
0    -6.0
1    -4.0
2    -2.0
3     0.0
4     2.0
5     0.0
6     2.0
7     0.0
8    -1.0
9     0.0
10    3.0
11   -1.0
12    0.0
dtype: float64
In [177]:
# O método mask() substitui os valores quando satisfaz-se a condição (contrário do where)

d = c.mask(c > 3, 10) # Se c > 3, então o valor será substituído por 10, senão, mantém
e = c.mask(c <= 3, 0) # Se c <= 3, será 0, senão, mantém  
In [178]:
d
Out[178]:
0     -6.0
1     -4.0
2     -2.0
3      0.0
4      2.0
5     10.0
6      2.0
7     10.0
8     -1.0
9      0.0
10     3.0
11    -1.0
12    10.0
dtype: float64
In [179]:
e
Out[179]:
0     0.0
1     0.0
2     0.0
3     0.0
4     0.0
5     4.0
6     0.0
7     5.0
8     0.0
9     0.0
10    0.0
11    0.0
12    6.0
dtype: float64
Tratando dados ausentes (missing data) com isna(), notna(), dropna() e fillna()
In [181]:
dados = pd.Series([2, 5, np.nan, 0, 3, None, 6])
dados
Out[181]:
0    2.0
1    5.0
2    NaN
3    0.0
4    3.0
5    NaN
6    6.0
dtype: float64
In [182]:
# O método isna() apenas retorna uma lista com resultados booleanos dos valores ausentes

dados.isna()
Out[182]:
0    False
1    False
2     True
3    False
4    False
5     True
6    False
dtype: bool
In [183]:
# O método notna() retornará uma lista com resultados booleanso dos valores não ausentes

dados.notna()
Out[183]:
0     True
1     True
2    False
3     True
4     True
5    False
6     True
dtype: bool
In [187]:
# O método dropna() irá retornar uma lista com os valores nulos ou ausentes

dados_sem_ausentes = dados.dropna()
dados_sem_ausentes
Out[187]:
0    2.0
1    5.0
3    0.0
4    3.0
6    6.0
dtype: float64
In [191]:
# Ao informar o parâmetro inplace, será feita a remoção na própria Series

dados.dropna(inplace = True)
dados
Out[191]:
0    2.0
1    5.0
3    0.0
4    3.0
6    6.0
dtype: float64
In [193]:
# O método fillna() irá retornar uma lista com valores nulos preenchidos por outros valores 

dados = pd.Series([2, 5, np.nan, 0, 3, None, 6])

dados_ausentes_preenchidos = dados.fillna(1)
dados_ausentes_preenchidos
Out[193]:
0    2.0
1    5.0
2    1.0
3    0.0
4    3.0
5    1.0
6    6.0
dtype: float64
In [198]:
# Parâmetros bfill (preenche com o valor posterior ao NaN), ffill (preenche com o valor anterior ao NaN) e inplace

dados_bfill = dados.fillna(method = "bfill")
dados_ffill = dados.fillna(method = "ffill")
dados.fillna(-1, inplace = True)
In [199]:
dados_bfill
Out[199]:
0    2.0
1    5.0
2    0.0
3    0.0
4    3.0
5    6.0
6    6.0
dtype: float64
In [200]:
dados_ffill
Out[200]:
0    2.0
1    5.0
2    5.0
3    0.0
4    3.0
5    3.0
6    6.0
dtype: float64
In [201]:
dados
Out[201]:
0    2.0
1    5.0
2   -1.0
3    0.0
4    3.0
5   -1.0
6    6.0
dtype: float64
Métodos de Ordenação
In [202]:
idades_2
Out[202]:
Nome
Agatha         24
Alice          27
Alícia         18
Amanda         18
Ana Beatriz    44
               ..
Valentina      54
Vinicius       32
Vitor          41
Vitória        49
Yasmin         52
Name: Idade, Length: 100, dtype: int64
In [206]:
# Realizando uma ordenação pelos valores, no caso, a idade

idades_ordenadas_valores = idades_2.sort_values()
idades_ordenadas_valores.head(15)
Out[206]:
Nome
Bernardo          18
Alícia            18
Amanda            18
Heloísa           18
Maria Fernanda    18
Benjamin          19
Rodrigo           19
Daniel            19
Cecília           21
Julia             21
Catarina          21
Henrique          22
Joaquim           22
Manuela           23
Esther            23
Name: Idade, dtype: int64
In [207]:
# Realizando a ordenação pelo índice

idades_ordenadas_rotulos = idades_2.sort_index()
idades_ordenadas_rotulos.head(15)
Out[207]:
Nome
Agatha         24
Alice          27
Alícia         18
Amanda         18
Ana Beatriz    44
Ana Clara      46
Ana Julia      49
Ana Luiza      47
Antônio        47
Arthur         41
Beatriz        27
Benjamin       19
Bernardo       18
Bianca         25
Bruno          31
Name: Idade, dtype: int64
Manipulação de Strings
In [208]:
livros = pd.Series(["Introdução à programação com Python",
                    "Curso Intensivo de Python",
                    "Python para análise de dados"])
livros
Out[208]:
0    Introdução à programação com Python
1              Curso Intensivo de Python
2           Python para análise de dados
dtype: object
In [210]:
# Utilizando letras minúsculas com lower()

livros.str.lower()
Out[210]:
0    introdução à programação com python
1              curso intensivo de python
2           python para análise de dados
dtype: object
In [211]:
# Utilizando letras maiúsculas com upper()

livros.str.upper()
Out[211]:
0    INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON
1              CURSO INTENSIVO DE PYTHON
2           PYTHON PARA ANÁLISE DE DADOS
dtype: object
In [214]:
# Utilizando letras capitalização

minusculas = livros.str.lower()
minusculas.str.capitalize()
Out[214]:
0    Introdução à programação com python
1              Curso intensivo de python
2           Python para análise de dados
dtype: object
In [217]:
# Definindo Strings como títulos

minusculas.str.title()
Out[217]:
0    Introdução À Programação Com Python
1              Curso Intensivo De Python
2           Python Para Análise De Dados
dtype: object
Métodos para plotagens de gráficos com Series
In [220]:
# Gerando uma série de 38 notas aleatórias entre 0 e 100

np.random.seed(50)
notas = pd.Series(np.random.randint(0, 101, 38))
notas.head()
Out[220]:
0    48
1    96
2    11
3    33
4    94
dtype: int32
In [222]:
notas.describe()
Out[222]:
count    38.000000
mean     48.394737
std      31.296783
min       2.000000
25%      23.000000
50%      45.500000
75%      74.750000
max      96.000000
dtype: float64
In [226]:
# Plotando um gráfico de histograma

%matplotlib inline

notas.plot.hist()
Out[226]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2a8d434c8>
In [229]:
# Ao informar o valor bins por parâmetro, irá gerar o histograma com 101 barras para realizar a comparação 

notas.plot.hist(bins = 101)
Out[229]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ace78488>
In [230]:
np.sort(notas)
Out[230]:
array([ 2,  2,  4,  5,  6,  6, 11, 19, 20, 22, 26, 26, 30, 31, 33, 35, 35,
       41, 43, 48, 49, 60, 64, 66, 68, 70, 70, 71, 76, 78, 79, 85, 90, 91,
       92, 94, 95, 96])
In [231]:
# Gerando um gráfioc de barras

notas.plot.bar()
Out[231]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ace72548>
In [232]:
# Gerando um gráfioc de área

notas.plot.area()
Out[232]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ad13d748>
In [233]:
# Gerando um gráfioc de boxplot

notas.plot.box()
Out[233]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ad1b3108>
In [234]:
# Gerando um gráfioc de linhas

notas.plot.line()
Out[234]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ad1bb948>
In [238]:
# É possível gerar o histograma sem a necessidade do plot

notas.hist()
Out[238]:
<matplotlib.axes._subplots.AxesSubplot at 0x1f2ace44cc8>