Pandas #1: Trabalhando com dados no Python e suas principais estruturas
(You can find the english version of this post here)
Todos nós sabemos que o Python e o R são as linguagens principais quando falamos sobre Ciência de Dados e que uma das principais características de ambas linguagens são suas grandes comunidades e sua disposição a se ajudar. No mundo “Pytônico” existe um consenso quando se trata de uma stack base de bibliotecas para quem pretende trabalhar com manipulação de dados com velocidade, elegância e eficiência.
Uma das mais importantes é o Pandas:
O Pandas é desenvolvido desde 2008 como um projeto open source e por anos vem economizando horas de trabalho de programadores e cientistas/analistas de dados. Mas o que torna o Pandas tão incrível? O coração dessa biblioteca é sua capacidade de manipular estruturas de dados e as ferramentas que disponibiliza para análise complexa de dados.
Você pode encontrar instruções sobre como instalar o Pandas aqui: (obs: o Pandas depende da instalação do Numpy).
Aqui você encontra uma introdução útil para começar a trabalhar com o Pandas:
Estruturas Básicas
O Pandas possui dois objetos principais: as Series e os Dataframes.
SERIES
As series são arrays unidimensionais rotulados que podem conter qualquer tipo de dado(int, float, list,…). Os rótulos são chamados de índices e são utilizados para se encontrar de maneira explícita qualquer dado a ser manipulado. Irei criar uma simples lista e utilizá-la para criar um exemplo de series:
import numpy as np
import pandas as pds = pd.Series(["a", "b", "c", "d"])print(s)
>>> 0 a
1 b
2 c
3 d
dtype: object
Como você pode ver, utilizando o método Series() criei uma series com itens indexados de 0 a 3, mas eu sei o que você está pensando: “Grande coisa…isso é exatamente o que uma lista nativa do Python faz!”. Sim, mas e se você quiser nomes mais intuitivos para os itens? Bem, você pode alterar os índices passando uma lista de nomes para a series como parâmetro enquanto ela esta sendo criada:
s = pd.Series(["a", "b", "c", "d"], index=["first", "second", "third", "fourth"])
ou chamando o atributo .index:
s.index = ["first", "second", "third", "fourth"]
print(s)
>>> first a
second b
third c
fourth d
dtype: object
Outra maneira de criar índices customizados é passando um dicionário para o método Series() ao invés de uma lista. As chaves do dicionário serão consideradas como os índices da series:
s = pd.Series({"first: "a", "second": "b", "third": "c", "fourth": "d"})
print(s)
>>> first a
second b
third c
fourth d
dtype: object
e os dados podem ser acessados como em um dicionário:
print(s.second)
>>> bprint(s['second'])
>>> b
Alterando os índices para nomes que são mais fáceis de lembrar é mais conveniente, mas isso é tudo. Se você quiser continuar acessando os dados pelos índices originais, você ainda poderá fazê-lo:
print(s)
>>> first a
second b
third c
fourth d
dtype: objectprint(s[0])
>>> a
DATAFRAME
O Datatrame é uma estrutura de dados rotulados bidimensional, com linhas e colunas, assim como uma planilha ou tabela. Assim como as series, os dataframes podem armazenar qualquer tipo de dado. Uma coisa importante a destacar é que todas as colunas de um dataframe são series. Portanto, um dataframe nada mais é do que uma associação de várias series como colunas! Criarei um simples dataframe utilizando o método DataFrame():
import numpy as np
import pandas as pddf = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]])print(df)
>>> 0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
Note que para criar o dataframe é passado para o método uma lista de listas, onde cada lista secundária se torna uma linha e, assim como em uma series, cada linha e coluna possui seu índice. Contudo, também podemos renomeá-las da mesma maneira:
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], index=["first", "second", "third"], columns=["col1", "col2", "col4"])print(df)
>>> col1 col2 col3
first 1 2 3
second 4 5 6
third 7 8 9
Acessar qualquer coisa em um dataframe utilizando índices diretamente somente é permitido se você não nomear as colunas. Caso você tente fazer isso com o dataframe acima, o interpretador retornará um erro:
print(df[0])
>>> KeyError: 0
Utilizando diretamente seu nome, você pode acessar qualquer coluna:
print(df["col2"])
>>> first 2
second 5
third 8
Name: col2, dtype: int64
Bem…se você quiser acessar as linhas ou um valor específico do dataframe? Existem duas maneiras diferentes de acessar linhas e colunas. Elas são utilizando os atributos loc e iloc.
- Como o loc funciona?
Com o loc você pode passar as coordenadas de linha x coluna com os respectivos nomes para acessar o valor:
print(df.loc["third","col4"])
>>> 9
Na maioria das vezes, as linhas não são nomeadas. Neste caso, as linhas são automaticamente indexadas com números e você pode utilizá-los tranquilamente dentro de loc:
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=["col1", "col2", "col4"])print(df)
>>> col1 col2 col3
0 1 2 3
1 4 5 6
2 7 8 9print(df.loc[2,"col3"])
>>> 9
Anteriormente eu disse que você não poderia utilizar índices para acessar os dados diretamente, mas o iloc nos ajudará neste caso!!
- Como o iloc funciona?
Este atributo funciona exatamente da mesma maneira que o loc, com a exceção de que você deve passar os índices ao invés de nomes:
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=["col1", "col2", "col4"])print(df)
>>> col1 col2 col3
0 1 2 3
1 4 5 6
2 7 8 9print(df.iloc[0, 0])
>>> 1
Alternativa!!!
Além de loc and iloc, existe outro atributo chamado at. Este atributo funciona exatamente como o loc, porém ele realmente acessa apenas um item, uma posição de dado enquanto o loc pode acessar um conjunto:
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=["col1", "col2", "col4"])print(df)
>>> col1 col2 col3
0 1 2 3
1 4 5 6
2 7 8 9print(df.at[2,"col3"])
>>> 9
Este acesso a várias linhas e colunas (chamado slicing) será discutido em um próximo post e o link será incluído logo abaixo quando finalizado!
Seja Bem-vindo ao mundo do Pandas!