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

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:

pd.Series?

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

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

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

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

# seleciona linha na posicao 1
df.loc[1]

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

# linha da posicao 1, traz coluna Nome
df.loc[1,'Nome']

Ou ainda passar um conjunto de linhas:

# traz as linhas da posicao 1,2 e 3 para coluna Nome
df.loc[1:3,'Nome']

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

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

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]

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)]
# filtra o aluno que foi reprovado em pelo menos uma materia
df[(df['Matemática'] < 6) | (df['Português'] < 6)]

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

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:

# exclui a coluna nome
df.drop(columns=['Nome'])

Note que o drop não é definitivo. Caso você abra o dataframe de novo, verá que a coluna Nome continua por lá.

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

# exclui a coluna nome de forma definitiva

df = df.drop(columns=['Nome'])

# ou entao

df_sem_nome = df.drop(columns=['Nome'])

EXCLUINDO LINHAS

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

df.drop(1)

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

df = df.drop(1)

Ou a um novo dataframe de nome diferente:

df_v2 = df.drop(1)

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

ORDENANDO OS DADOS

# ordena pela nota de matematica

df.sort_values(by='Matemática')

# ordena pelos nomes

df.sort_values(by='Nome')

# ordena de forma decrescente pela nota de portugues

df.sort_values(by='Português', ascending=False)

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!

8 comentários em “Tutorial: Tratando sua Tabela no Python (com Pandas)”

  1. Bom dia, parabéns pelo site. Notei que a partir do tópico “Excluindo colunas” aparece cógido HTML com os exemplos em Python. Seria apenas no meu navegador? Obrigado.

    1. Bom dia, Mateus. Obrigado pelo elogio.
      Aqui no safari também estava aparecendo este erro. Esta formatação para os códigos é meio ruim, não é a primeira vez que isso acontece (talvez eu até a abandone e passe a postar em formato de texto). Veja se agora está ok, por favor.
      Obrigado mais uma vez pelo aviso.

  2. Oi sera que vc poderia me ajudar?
    Estou começando com Python, e estou tentando usar o google Colaboratory.
    Minha inecessidade é fazer uma analise dos dados de um arquivo de log gerado por um outro sistema. O arquivo gerado é .csv, separado por “;”.
    Bom par começar preciso importar os dados e estou tentando usar o pandas, mas esta sempre ocorrendo um erro. a seguir, estou lhe enviando o código e em seguida o erro:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    print(“Hello world”)
    a_file = ‘C:/db/Log1500.txt’

    ## pd.read_csv(‘C:\db\Log1500.txt’,sep’;’)
    print(“path : “, a_file)
    log = pd.read_csv(a_file,sep”;”,)

    File “”, line 9
    log = pd.read_csv(a_file,sep”;”)
    ^
    SyntaxError: invalid syntax

    bom, para começar com qualquer coisa preciso importar o arquivo, o que não estou conseguindo.
    Se puder me ajudar =, fico muito grato.
    Ta Sil

  3. Infelizmente ainda não deu…

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt

    file_1 = “C:/db/Log1500.txt”
    print(file_1)
    pd.read_csv(file_1, sep = ‘;’)

    C:/db/Log1500.txt
    —————————————————————————
    FileNotFoundError Traceback (most recent call last)
    in ()
    6 file_1 = “C:/db/Log1500.txt”
    7 print(file_1)
    —-> 8 pd.read_csv(file_1, sep = ‘;’)

    4 frames
    /usr/local/lib/python3.6/dist-packages/pandas/io/parsers.py in __init__(self, src, **kwds)
    1915 kwds[“usecols”] = self.usecols
    1916
    -> 1917 self._reader = parsers.TextReader(src, **kwds)
    1918 self.unnamed_cols = self._reader.unnamed_cols
    1919

    pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

    pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()

    FileNotFoundError: [Errno 2] File b’C:/db/Log1500.txt’ does not exist: b’C:/db/Log1500.txt’

    embora o erro diz que o path e/ou arquivo não existe, mas eles existem sim.

    1. Veja se algumas dessas soluções funciona:
      1) Use o r antes do endereço. Algo como: pd.read_csv(r’C:\Users\arquivo.csv’)
      2) Se colocar o r não funcionar, digite o endereço com ‘\\’ ao invés de ‘/’
      3) Se nada funcionar, vamos pelo menos jogar o arquivo direto no diretório em que está seu programa, para ver se pelo menos o Python consegue ler normalmente. Se isso der certo, tem algo no diretório que está atrapalhando, pode ser permissão, ou algum nome. Aí você até poderia fazer uma tarefa no próprio computador que jogasse o arquivo no diretório que você está trabalhando de acordo com a rotina que você quer fazer.

      Teste essas soluções funciona, se nenhuma funcionar me avise.

  4. Pois é, a soluções 1 e 2 ainda não funcionaram.

    Como lhe disse anteriormente, estou utilizando o Google Colaboratory. Não tenho o Python instalado na minha máquina.Não consegui tbm acessar o suporte do Google para verificar o que pode estar acontecendo.

    Como alternativa, tentei instalar o Python via Anaconda, mas tbm não instalou. Vi em alguns sites que as vezes não instala, para que eu tentasse o miniconda, Mas ainda vou ter de desinstalar o “resto” do anaconda e tentar instalar o miniconda. Mas tbm não achei o onde posso baixar o arquivo de instalação do miniconda.

    A solução do Google Colaboratory me pareceu a ideal, pois utiliza o Python 3.7 sem a necessidade de instalar nada na minha maquina alem de poder acessar de qualquer lugar.

    Pena que não esteja funcionando.

    Mas de qualquer forma obrigado por estar me ajudando.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *