Importando arquivo texto CSV 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 CSV.
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_csv 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 de 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 CSV.
#importo o arquivo df = pd.read_csv('caminho_do_arquivo\\nome_do_arquivo.csv') df = pd.read_csv('olist_merged.csv') #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, com a estrutura de dados DataFrame, que é como se fosse uma tabela comum que criamos em Excel.
Bem simples, né?
Agora vamos falar das dificuldades para importar o arquivo:
Agora vamos falar das dificuldades para importar o arquivo:
Dificuldade 1- Arquivos texto podem ter diferentes separadores de coluna: vírgula, ponto e vírgula, tab, pipe, etc. O padrão da função pd.read_csv é vírgula, porém o padrão brasileiro é ponto e vírgula, então em geral temos que tratar esse caso.
Para isso, usamos o argumento "sep" da função: sep = ";". Nele você especifica qual é o separador de colunas do arquivo.
Então fica assim:
Para isso, usamos o argumento "sep" da função: sep = ";". Nele você especifica qual é o separador de colunas do arquivo.
Então fica assim:
#importo o arquivo df = pd.read_csv('olist_merged.csv', sep = ';')
Dificuldade 2- Outro argumento que entendo como importante no Brasil é o "encoding". Sempre bom especificarmos encoding = "utf-8" por causa dos caracteres especiais da nossa língua: acento, tio, ç... Desse jeito já conseguimos tratar essa questão.
#importo o arquivo df = pd.read_csv('olist_merged.csv', sep = ';', encoding = 'utf-8')
Dicas
Existem 3 argumentos da função pd.read_csv 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_csv('olist_merged.csv', 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.
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'
]
#importo o arquivo
df = pd.read_csv("olist_merged.csv"
, sep = ";"
, encoding = "utf-8"
#, 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_csv("olist_merged.csv"
, sep = ";"
, encoding = "utf-8"
#, 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
Postar um comentário