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 E é 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 columnsdf.corr()
Returns the correlation between columns in a data framedf.count()
Returns the number of non-null values in each data frame columndf.max()
Returns the highest value in each columndf.min()
Returns the lowest value in each columndf.median()
Returns the median of each columndf.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!
Pandas é show demais!
Pra aprender Python recomendo: https://www.pythonprogressivo.net
é bom tambem
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.
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.
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
Oi Ta, vc tem que escrever sep=’;’
Isso deve resolver seu problema. Teste e me avise.
Abs!
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.
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.
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.