Tutorial: Tratando sua Tabela no Python (com Pandas)

Este Tutorial deveria se chamar “Selecionando e Filtrando Elementos em um Dataframe no Python”, entretanto, para não confundir ninguém, exclui o termo “Dataframe”. De maneira formal, Dataframe é um objeto formado por séries bidimensionais. De forma esdrúxula, é o que normalmente lemos como uma tabela. Neste post, trabalhando com a biblioteca Pandas, vou mostrar como localizar elementos, fazer filtros, excluir colunas, ordenar os dados, dentre outras tarefas que realizamos em Dataframes.

POR QUE NO PANDAS?

A biblioteca Pandas, assim como NumPy e Scikit, está entre as bibliotecas mais utilizadas no Python. Sua utilidade no tratamento de dados é enorme, pois com ela você pode lidar tranquilamente com séries e tabelas, organizando, filtrando e fazendo várias manipulações com seus dados. Por este motivo, muitas vezes será interessante você utilizar o formato DataFrame da biblioteca. Caso você ainda não entenda muito do Python, lembre-se sempre que existe o post Primeiros passos em Python para te auxiliar.

Sendo assim, nosso primeiro passo é importar a biblioteca:


import pandas as pd

Lembre-se, sempre que fizermos uso da biblioteca, vamos utilizar o nome atribuído a ela. Por exemplo, se eu quiser criar uma série no Pandas, utilizando a função Series, o comando será dado em frente a declaração da biblioteca (i.e. do pd):


valores = [10, 10, 20, 30]

valores_serie = pd.Series(valores)

valores_serie

Captura de Tela 2019-02-04 às 14.13.27.png

No exemplo acima, criamos uma lista com alguns valores e, em seguida, a transformamos em uma série no formato usado pela biblioteca.

Caso você queira tirar uma dúvida, parecido com o que fazemos no R, você tem a opção de “questionar” o Python. Para isso, escreva o nome do termo e coloque o ponto de interrogação em frente. Veja para o caso do comando Series no Pandas:


pd.Series?

Captura de Tela 2019-02-04 às 14.08.11

Nem tudo que será utilizado neste post é exclusivo do Pandas. Sempre que for alguma função da biblioteca, ela será precedida por pd., como em ‘pd.Series’.

Atenção também para os casos em que as alterações não são definitivas. Há funções que alteram seus dados de forma definitiva, outras não. Sempre verifique seu dataframe após alguma mudança, ou sempre prefira já atribuir a mudança ao próprio dataframe (e.g.: df = df.T).

CONSTRUINDO UM DATAFRAME NO PANDA

Podemos construir um dataframe juntando diversas séries:


aluno_1 = pd.Series({'Nome': 'João', 'Matemática': 6, 'Português': 7})

aluno_2 = pd.Series({'Nome': 'Maria', 'Matemática': 8, 'Português': 8})

aluno_3 = pd.Series({'Nome': 'Pedro', 'Matemática': 4, 'Português': 5.3})

aluno_4 = pd.Series({'Nome': 'Suzana', 'Matemática': 5.8, 'Português': 6.5})

df = pd.DataFrame([aluno_1, aluno_2, aluno_3, aluno_4])
df

Captura de Tela 2019-02-04 às 14.34.59

Pronto, o dataframe está criado para que a gente prossiga com os exemplos. Claro, você provavelmente não vai ter que escrever suas tabelas do zero. O que você normalmente faria, seria importar um arquivo qualquer. Com um arquivo no formato csv, utilizando o pd.read_csv do Python, você já terá um arquivo em formato csv. Se tivéssemos um arquivo com as notas dos alunos, faríamos o seguinte:


df = pd.read_csv('nota_dos_alunos.csv')

Caso você tenha dúvidas se é um dataframe, você pode validar com a função isinstance():


isinstance(df, pd.Dataframe)

SELECIONANDO ELEMENTOS

Agora que você já tem sua tabela, você provavelmente vai querer selecionar alguns elementos, ou colunas, que você queira analisar. Para isso, você deve inserir o nome do data frame junto com dois colchetes e, no interior dos colchetes, o nome da coluna ou linha que deseja selecionar:


df['Nome']

df['Matemática']

Captura de Tela 2019-02-04 às 14.36.11

Captura de Tela 2019-02-04 às 14.36.30

Agora, se você quiser selecionar alguma linha específica, utilize o loc:


df.loc[1]

Captura de Tela 2019-02-04 às 14.38.41

Você pode ainda apontar para a linha e a coluna, escolhendo assim somente o elemento que você deseja:


df.loc[1,'Nome']

Captura de Tela 2019-02-04 às 14.44.37.png

Ou ainda passar um conjunto de linhas:


df.loc[1:3,'Nome']

Captura de Tela 2019-02-04 às 14.40.06

Como de costume, a linha 1 representa a segunda linha da tabela, pois o Python inicia suas contagens de posição sempre no zero.

http://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html

ALTERANDO ELEMENTOS

Alterar elementos é o mais intuitivo, basta atribuir um valor novo ao elemento em questão:


df.loc[1,'Nome']= "Ana Maria"
df

Captura de Tela 2019-02-04 às 16.05.24.png

RENOMEAR COLUNAS

Para renomear as colunas, você pode simplesmente determinar os nomes delas no seu dataframe, referindo-se a elas como columns. No exemplo abaixo, é acrescentado um ponto final nos nomes das colunas:


df.columns = "Nome.", "Matemática.", "Português." 

df

Outra opção, é utilizar a função rename, apontando o nome atual da coluna e qual deve ser o novo nome. Vamos retirar os pontos adicionados nos nomes:


df = df.rename(columns={'Nome.': 'Nome', 'Matemática.': 'Matemática','Português.': 'Português'})
df

REALIZANDO FILTROS 

Outra tarefa de extrema importância é a realização dos filtros. Todo mundo sabe, o chefe quer ver o público que gasta acima de 500 reais nas compras, a marca quer fazer uma ação só para pessoas com mais de 50 anos, etc. Sendo assim, no nosso caso, vamos selecionar somente os alunos que tiraram menos que 6 em matemática:


df.loc[df['Matemática'] < 6]

Captura de Tela 2019-02-04 às 16.33.14

Bom, mas este filtro seria bom para o professor de matemática. E se a diretora do colégio quiser saber quais os alunos que ficaram de recuperação em alguma matéria? Ou se alguém quiser saber os alunos que ficaram de recuperação em ambas as matérias? Ou seja, como fazemos dois filtros simultaneamente no Python?

Simples. Lembre-se sempre que o operador utilizado para OU é o ‘|’ e para o é o &, logo, vamos fazer uma pequena adaptação do comando acima:


# filtra aluno que nas foi reprovado em ambas as materias

df[(df['Matemática'] < 6) & (df['Português'] < 6)]

Captura de Tela 2019-02-04 às 16.33.26.png


# filtra o aluno que foi reprovado em pelo menos uma materia

df[(df['Matemática'] < 6) | (df['Português'] < 6)]

Captura de Tela 2019-02-04 às 16.33.14.png

Caso você queira filtrar elementos que sejam diferentes de algum valor, deve usar ‘!=’.

TRANSPOSIÇÃO

Menos comum, mas que tem o seu valor (quem nunca usou o alt+c+v+t no Excel?), a transposição também é fácil de ser executada no Python e isso é feito com apenas UMA letra:


df.T

Captura de Tela 2019-02-04 às 16.35.54.png

Se quiser transpor de forma definitiva, ou atribui a transposição ao antigo dataframe ou crie um novo dataframe com um nome de fácil identificação. Eu recomendo mais esta segunda opção.

EXCLUINDO COLUNAS

Há algumas opções para esta tarefa. Eu prefiro a que menciona columns, pois fica mais fácil de memorizar:


<p style="text-align:justify;"># exclui a coluna nome</p>
<p style="text-align:justify;">df.drop(columns=['Nome'])</p>
<p style="text-align:justify;">

Note que o drop não é definitivo:


<p style="text-align:justify;"># exclui a coluna nome</p>
<p style="text-align:justify;">df.drop(columns=['Nome'])
df</p>
<p style="text-align:justify;">

Captura de Tela 2019-02-04 às 18.49.41.png

Para fazer algo definitivo, como já expliquei lá em cima (e também embaixo):


<p style="text-align:justify;"># exclui a coluna nome de forma definitiva</p>
<p style="text-align:justify;">df = df.drop(columns=['Nome'])</p>
<p style="text-align:justify;"># ou entao</p>
<p style="text-align:justify;">df_sem_nome = df.drop(columns=['Nome'])</p>
<p style="text-align:justify;">

EXCLUINDO LINHAS

Aqui, utilizaremos a numeração das linhas, porque não utilizamos nenhuma nomenclatura/índice:


<p style="text-align:justify;">df.drop(1)</p>
<p style="text-align:justify;">

A função drop() também não é definitiva, assim como transposição, você deve atribuir a alteração ao antigo nome:


<p style="text-align:justify;">df = df.drop(1)</p>
<p style="text-align:justify;">

Ou a um novo dataframe de nome diferente:


<p style="text-align:justify;">df_v2 = df.drop(1)</p>
<p style="text-align:justify;">

Ainda é possível excluir linhas ou colunas que tenham dados missing (df.dropna) e linhas duplicadas (df.drop_duplicates).

ORDENANDO OS DADOS


<p style="text-align:justify;"># ordena pela nota de matematica</p>
<p style="text-align:justify;">df.sort_values(by='Matemática')</p>
<p style="text-align:justify;"># ordena pelos nomes</p>
<p style="text-align:justify;">df.sort_values(by='Nome')</p>
<p style="text-align:justify;"># ordena de forma decrescente pela nota de portugues</p>
<p style="text-align:justify;">df.sort_values(by='Português', ascending=False)</p>
<p style="text-align:justify;">

CÁLCULO DAS ESTATÍSTICAS

É possível obter várias estatísticas do seu dataframe, de forma simples e rápida, com algumas funções. Não é necessário inserir nada entre os parênteses, as funções abaixo retornam os dados de todas as variáveis numéricas:

  • df.mean()Returns the mean of all columns
  • df.corr()Returns the correlation between columns in a data frame
  • df.count()Returns the number of non-null values in each data frame column
  • df.max()Returns the highest value in each column
  • df.min()Returns the lowest value in each column
  • df.median()Returns the median of each column
  • df.std()Returns the standard deviation of each column

Outra função interessante é a describe(), que traz um resumo dos dados: df.describe().

É possível inserir números dentro das funções e com isso trazer o resumo da linha.

Creio que o mais importante para trabalhar a tabela já esteja aqui. Com o tempo, colocarei outras tarefas para se fazer no Python e com o Pandas. Se você notou algo que você faz com frequência e eu não coloquei, deixa um comentário. Se gostou do post, por favor comente ou deixe uma curtida também. É bem legal receber o feedback de quem acompanha o blog. Aliás, críticas também serão sempre bem recebidas. Como faço os posts sozinho, sem revisão, pode sempre escapar alguma coisa.

E para quem tem Twitter, eu tenho uma conta para o EstatSite, segue lá: @EstatSite.

Valeu e bons estudos!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s