Importando Excel no Python com Pandas

Carregar excel no Python com Pandas

Introdução

Chamamos de "importar dados" uma ação de carregar dados em algum ambiente (plataforma, site, sistema, ferramenta, etc). Neste caso, estamos falando de importar dados para o Python, ou seja, vamos carregar dados na memória através do Python para analisá-los.

Esses dados podem ser de diferentes formatos: .xlsx (Excel), .csv ou .txt (texto), .json, etc. Nesse post estamos falando especificamente do formato XLSX.

Importar os dados em geral é simples. O problema normalmente está nos formatos do dado e do arquivo. O tamanho da base também pode ser um problema dependendo do nível de detalhe que você precisa analisar.

Nesse post, vamos falar da função read_excel da biblioteca Pandas.

Vamos usar de exemplo uma base de um e-commerce brasileiro que está no kaggle. Link abaixo se quiser conferir:

https://www.kaggle.com/olistbr/brazilian-ecommerce

Para trabalhar esse post, juntei as 9 tabelas em apenas 1 tabela para simular melhor o que tenho usado mais no meu dia-a-dia. Abaixo o link de download desse arquivo:

https://drive.google.com/open?id=1VpBpZ_bTMC_ag8nd_pjGpfXg0iB8WrYn

O Jupyter Notebook com tudo que eu explico nesse post está no link abaixo:

https://drive.google.com/open?id=1_ODGwFf-Um2AzcvWV7UEQ25Ej9UzZjzg


Importando o arquivo

Primeiro importamos a biblioteca Pandas.

#importo as bibliotecas que irei usar
import pandas as pd

#ajusto a configuração de visualização de colunas do Jupyter Notebook
pd.set_option('max_columns', None)

Em seguida, importamos o arquivo XLSX.

#importo o arquivo
df = pd.read_excel('caminho_do_arquivo\\nome_do_arquivo.xlsx')
df = pd.read_excel('olist_merged.xlsx') #arquivo do código e arquivo de dados estão na mesma pasta, não preciso do caminho do arquivo

Consideração 1: quando for escrever o caminho completo do arquivo (pastas+arquivo), é preciso utilizar barra invertida "/" ou duas barras "\\" ao invés da barra única "\" que copiamos no windows.

Consideração 2: se o arquivo com o código Python estiver na mesma pasta do dado, não precisa colocar o caminho da pasta, apenas o nome do arquivo.

Consideração 3: precisamos guardar o arquivo em um objeto, por isso o "df =", senão é só uma leitura de dados e não conseguimos trabalhar nele depois. "df" (de DataFrame) é bem comum ser usado, mas pode dar o nome que quiser. 

Consideração 4: quando importamos dados com Pandas, a estrutura de dados é o DataFrame, que é como se fosse uma tabela comum que criamos em Excel.

Bem simples, né? 

Tem um argumento dessa função que é específico para excel e ele passa a ser muito importante se temos diversas abas na planilha. O argumento é o sheet_name.

df = pd.read_excel("olist_merged.xlsx", sheet_name = "Planilha1")

Um arquivo Excel pode ter diversas abas e este argumento é onde especificamos o nome da aba que queremos importar. 

Também podemos utilizar o número da aba como referência, lembrando que a contagem no Python como no zero, então: se queremos a planilha 1, colocamos o parâmetro 0 (zero); se queremos a planilha 2, colocamos o parâmetro 1; assim segue.

Podemos ainda passar uma lista caso precisemos mais de uma aba do arquivo Excel.


Dicas

Existem 3 argumentos da função pd.read_excel que podem ser combinados para ajudar a importar arquivos muito grandes.



1. nrows: limita a quantidade de linhas que serão importadas. É bom para conseguir dar uma olhada no arquivo antes de importar completo.
Por exemplo:

#importo o arquivo
df = pd.read_excel('olist_merged.xlsx', sep = ';', encoding = 'utf-8', nrows = 100)


2. usecols: passamos uma lista apenas com as colunas que queremos importar. É útil quando temos muitas colunas que não utilizaremos e melhora bastante a performance de importação, isso é mais perceptível em arquivos muito grandes.


#listo as colunas que quero importar
lista_colunas = ['order_id', 'order_purchase_timestamp', 'order_approved_at', 'order_delivered_customer_date', 'order_estimated_delivery_date', 'customer_city', 'customer_state', 'payment_type', 'payment_value', 'product_id', 'price', 'freight_value', 'product_category_name' ] #importo o arquivo df = pd.read_excel("olist_merged.xlsx" , sheet_name = "Planilha1" #, nrows = 100 , usecols = lista_colunas )

Uma função que ajuda aqui é a list(df) que traz uma lista com todas as colunas e facilita na hora de selecionar as que queremos.

Aqui eu arrumei o pd.read_csv de um jeito que eu gosto, que facilita quando quero tirar um argumento, é só comentar. Ele pode ser escrito em uma linha só normalmente também.


3. dtype: neste argumento passamos um dicionário especificando o formato das colunas que estamos importando.
Em geral, prefiro importar tudo como object (que é string) e depois tratar os dados que precisarem, como as colunas de data. Nesse caso temos algumas colunas de valor, preço, quantidade que podemos importar já como números.

#listo as colunas que quero importar
lista_colunas = ['order_id',
                 'order_purchase_timestamp',
                 'order_approved_at',
                 'order_delivered_customer_date',
                 'order_estimated_delivery_date',
                 'customer_city',
                 'customer_state',
                 'payment_type',
                 'payment_value',
                 'product_id',
                 'price',
                 'freight_value',
                 'product_category_name'
                ]

#especifico os tipos das colunas
tipos_colunas = {'order_id': str,
                 'order_purchase_timestamp': str,
                 'order_approved_at': str,
                 'order_delivered_customer_date': str,
                 'order_estimated_delivery_date': str,
                 'customer_city': str,
                 'customer_state': str,
                 'payment_type': str,
                 'payment_value': float,
                 'product_id': str,
                 'price': float,
                 'freight_value': float,
                 'product_category_name': str
                }

#importo o arquivo
df = pd.read_excel("olist_merged.xlsx"
                 , sheet_name = "Planilha1"
                 #, nrows = 100
                 , usecols = lista_colunas
                 , dtype = tipos_colunas
                )

 

Gostou do conteúdo? Tem alguma dúvida, sugestão ou ideia? Deixe um comentário para que eu consiga saber o que acharam.

Comentários

  1. excelentes dicas. há uma forma de não importar células em branco ou nulas?

    ResponderExcluir
    Respostas
    1. Opa, valeu!

      Eu nunca usei nada que não importe células em branco ou nulas. Pelo que entendi, esse seria mais um caso para melhorar a performance de importação de arquivos, certo?

      Olhando a documentação dessa função read_excel, tem alguns argumentos para tratar brancos e nulos. Acho que o argumento que na_filter=False faz o que você está falando e se combinado com o argumento na_values parece um ferramenta interessante para melhorar a performance de importação de brancos e nulos em qualquer arquivo e em qualquer formato que vier o nulo.

      Documentação:
      https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html

      "na_filter: bool, default True
      Detect missing value markers (empty strings and the value of na_values). In data without any NAs, passing na_filter=False can improve the performance of reading a large file."

      Aqui vale o teste. Se tiver algum exemplo específico que possa passar, seria legal para testar.

      Vou testar também para entender como aplica e o quanto melhora a performance em bases que tenho e incluo nas dicas do post se fizer sentido.

      Abraço!

      Excluir

Postar um comentário

Postagens mais visitadas deste blog

Importando arquivo texto CSV no Python com Pandas