Como vimos DataFrame é um array 2D com rótulos.
Os tipos das colunas podem ser heterogêneas (de diversos tipos). Ele tem as seguintes propriedades:
index
no caso da linhas e columns
no caso de colunas.Cada eixo do DataFrame tem um índice, seja o padrão ou não. Os índices são necessários para acesso rápido aos dados, bem como para realizar as operações disponíveis.
In [ ]:
import pandas as pd
import numpy as np
O DataFrame é a estrutura de dados comumente utilizada no pandas. O construtor aceita diferentes tipos de argumentos:
Podemos definir os índices das linhas e das colunas. Se eles não foram específicados, eles serão gerados a partir dos dados de entrada de maneira intuitiva. Por exemplo, as chaves do dicionário serão os rótulos das colunas.
Vamos criar um DataFrame utilizando um dicionário de Series e listas dentro de um dicionário.
In [ ]:
resumoAcoes = {
'GOOG' : pd.Series([740, 750], index=['Abertura', 'Fechamento']),
'FB' : pd.Series([110, 120], index=['Abertura', 'Fechamento']),
'TWTR' : pd.Series([20, 30], index=['Abertura', 'Fechamento']),
'AMZN' : pd.Series([740, 750], index=['Abertura', 'Fechamento']),
'AAPL' : [100, 90],
'NFLX' : [70, 80]
}
In [ ]:
acoesDF = pd.DataFrame(resumoAcoes)
print(acoesDF)
In [ ]:
acoesDF = pd.DataFrame(resumoAcoes, columns=['GOOG', 'FB', 'AMZN', 'NFLX'])
print(acoesDF)
In [ ]:
acoesDF.index
In [ ]:
acoesDF.columns
In [ ]:
dic_moedas = {
'US' : 'dolar',
'BR' : 'real',
'UK' : 'libra',
'JP' : 'iene'
}
moedas = pd.Series(dic_moedas)
moedas
In [ ]:
moedas.name = 'moedas'
In [ ]:
pd.DataFrame(moedas)
In [ ]:
dic_simbolos = {
'US' : 'U$',
'BR' : 'R$',
'UK' : '£',
'JP' : '¥'
}
simbolos = pd.Series(dic_simbolos)
simbolos
In [ ]:
simbolos.name = 'simbolos'
In [ ]:
moeda_simbolos = pd.DataFrame([moedas, simbolos])
moeda_simbolos
Durante o curso veremos outras formas de criar um DataFrame.
In [ ]:
print(moeda_simbolos['BR'])
In [ ]:
print(moeda_simbolos[['BR', 'US']])
In [ ]:
moeda_simbolos['MXN'] = '$'
In [ ]:
moeda_simbolos
In [ ]:
moeda_simbolos['MXN']['moedas'] = 'peso'
In [ ]:
moeda_simbolos
In [ ]:
del moeda_simbolos['MXN']
In [ ]:
moeda_simbolos
Também podemos utilizar o método pop
In [ ]:
uk = moeda_simbolos.pop('UK')
print(uk)
In [ ]:
moeda_simbolos
Basicamente, um DataFrame pode ser tratado como se fosse um dicionário de Series. Colunas são inseridas no final. Para inserir uma coluna em um local específico podemos utilizar a função insert
.
In [ ]:
moeda_simbolos.insert(0, 'UK', uk)
moeda_simbolos
In [ ]:
acoesDF1 = acoesDF
acoesDF1
In [ ]:
acoesDF2 = acoesDF * 2
acoesDF2['YHOO'] = 80
acoesDF2
In [ ]:
acoesDF1 + acoesDF2
No caso onde não exite rótulos de linhas e colunas em comum, o valor é preenchido com NaN
, por exemplo, YHOO
.
Se combinarmos o DataFrame com uma Series, o comportamento padrão é difundir a Series nas linhas. Vamos utilizar o acoesDF1
:
In [ ]:
acoesDF1
In [ ]:
# Pode ser 10 ou tem que ser uma lista com 4 elementos.
acoesDF1 + pd.Series(10,
index = ['GOOG', 'FB', 'AMZN', 'NFLX'])
In [ ]:
acoesDF1
In [ ]:
np.sqrt(acoesDF1)
In [ ]:
np.mean(acoesDF1)
Conforme vimos, o fatiamento e a indexação podem ser um pouco confuso.
Por exemplo, se uma Series tem um index explicito de inteiros, uma operação como s1[1]
irá utilizar o índice explicito, enquanto que uma operação de fatiamento como s1[1:3]
irá utilizar o índice implicito no estilo do Python.
Vamos testar!
In [ ]:
s1 = pd.Series(['a', 'b', 'c'], index=[1,3,5])
s1
In [ ]:
# índice explicito quando se está indexando
s1[1]
In [ ]:
# índice implicito quando se está fatiando
s1[1:3]
Como podemos perceber isso pode ser um pouco confuso no caso de índices de números inteiros.
Por isso, Pandas fornece alguns indexadores especiais que explicitamente contém esquemas de acesso aos índices.
Eles não são métodos funcionais e sim atributos que expõe uma interface de fatiamento particular para o dados.
Primeiro, o atributo loc
permite indexar e fatiar sempre utilizando o índice explícito.
In [ ]:
s1
In [ ]:
s1.loc[1]
In [ ]:
s1.loc[1:3]
Já o atributo iloc
permite indexar e fatiar sempre utilizando o índice implicito no estilo do Python.
In [ ]:
s1.iloc[1]
In [ ]:
s1.iloc[1:3]
In [ ]: