DataFrame

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:

  • Conceitualmente é semelhante a uma tabela ou planilha de dados.
  • Colunas podem ser de diferentes tipos: float64, int, bool.
  • Uma coluna do DataFrame é uma Series.
  • Podemos pensar que é um dicionário de Series, onde as colunas e linhas são indexadas, denota index no caso da linhas e columns no caso de colunas.
  • Seu tamanho é mutável: colunas podem ser inseridas e deletadas.

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

Criação do DataFrame

O DataFrame é a estrutura de dados comumente utilizada no pandas. O construtor aceita diferentes tipos de argumentos:

  • Dicionário de ndarrays de 1D, listas, dicionários, ou Series.
  • Array 2D do NumPy
  • Estruturado
  • Series
  • Outra estrutura DataFrame.

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.

Utilizando dicionários de Series

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

Utilizando Series


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.

Operações do DataFrame

Seleção

Uma coluna específica pode ser obtida como uma Series.


In [ ]:
print(moeda_simbolos['BR'])

In [ ]:
print(moeda_simbolos[['BR', 'US']])

Atribuição

Uma coluna pode ser adicionada via atribuição


In [ ]:
moeda_simbolos['MXN'] = '$'

In [ ]:
moeda_simbolos

In [ ]:
moeda_simbolos['MXN']['moedas'] = 'peso'

In [ ]:
moeda_simbolos

Remoção

Uma coluna pode ser deletada utilizando o nome (rótudo) e a função delconforme visto em dicionários.


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

Alinhamento

Objetos DataFrame alinham de uma maneira similar a Series, exceto que eles se alinham tanto nas colunas quanto nas linhas. O objeto resultante é uma união de colunas e linhas rotuladas.


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'])

Outras operações matemáticas

Operações matemáticas pode ser aplicadas em cada elemento do DF.


In [ ]:
acoesDF1

In [ ]:
np.sqrt(acoesDF1)

In [ ]:
np.mean(acoesDF1)

Outras operações

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 [ ]: