Gostaria de ler vários arquivos csv de um diretório para pandas e concatená-los em um grande DataFrame. Ainda não consegui descobrir. Aqui está o que eu tenho até agora:
import glob
import pandas as pd
# get data file names
path =r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
Acho que preciso de ajuda dentro do loop for ???
dfs
lista, que você não deseja substituir a linhadata = pd.read_csv(filename)
comdfs.append(pd.read_csv(filename)
. Você precisaria percorrer a lista econcat
, acho que nãoconcat
funcionará em uma lista dedf
s.big_frame = pd.concat(dfs, ignore_index=True)
, de qualquer maneira uma vez que você tem uma lista de dataframes você precisará iterar sobre a lista e concat para?big_frame
dfs
agora, para que algo comofor df in dfs: big_frame.concat(df, ignore_index=True)
funcione, você também pode tentar emappend
vez deconcat
também.concat
deve lidar com uma lista de DataFrames tão bem quanto você. Eu acho que essa é uma abordagem muito boa.Respostas:
Se você tiver as mesmas colunas em todos os seus
csv
arquivos, tente o código abaixo. Eu adicioneiheader=0
para que, depois de ler acsv
primeira linha, possa ser atribuído como o nome da coluna.fonte
df = pd.concat((pd.read_csv(f) for f in all_files))
Além disso, talvez deva-se usar emos.path.join(path, "*.csv")
vez depath + "/*.csv"
, o que o torna independente do SO.df['filename'] = os.path.basename(file_)
no loop for file_ .. não tem certeza se a resposta de Sid permite isso?pandas.read_csv(f).assign(filename = foo)
dentro do gerador.assign
retornará todo o quadro de dados, incluindo a nova colunafilename
Uma alternativa à resposta da darindaCoder :
fonte
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Os colchetes internos são exigidos pela versão 0.18.1 do Pandasglob.iglob
vez deglob.glob
; O primeiro retorna e iterador (em vez de uma lista) .fonte
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, para evitar lambdasA biblioteca do Dask pode ler um quadro de dados de vários arquivos:
(Fonte: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Os quadros de dados do Dask implementam um subconjunto da API de quadro de dados do Pandas. Se todos os dados couberem na memória, você poderá ligar
df.compute()
para converter o quadro de dados em um quadro de dados do Pandas.fonte
Quase todas as respostas aqui são desnecessariamente complexas (correspondência de padrões globais) ou dependem de bibliotecas adicionais de terceiros. Você pode fazer isso em duas linhas usando tudo o que o Pandas e o python (todas as versões) já incorporaram.
Para alguns arquivos - 1 liner:
Para muitos arquivos:
Esta linha de pandas que define o df utiliza três coisas:
pd.read_csv()
) o iterável (nossa lista), que é todo elemento csv nos caminhos de arquivos).fonte
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
mas deu um erro "parser_f () faltando 1 argumento posicional necessário: 'filepath_or_buffer'"Edit: Eu pesquisei no Google https://stackoverflow.com/a/21232849/186078 . No entanto, ultimamente, acho mais rápido fazer qualquer manipulação usando numpy e atribuí-la uma vez ao dataframe, em vez de manipular o próprio dataframe de forma iterativa, e parece funcionar também nessa solução.
Sinceramente, quero que qualquer pessoa que esteja acessando esta página considere essa abordagem, mas não queira anexar esse enorme código como comentário e torná-lo menos legível.
Você pode aproveitar o numpy para realmente acelerar a concatenação do quadro de dados.
Estatísticas de tempo:
fonte
Se você deseja pesquisar recursivamente ( Python 3.5 ou superior ), faça o seguinte:
Observe que as três últimas linhas podem ser expressas em uma única linha :
Você pode encontrar a documentação
**
aqui . Além disso, usei emiglob
vez deglob
, pois ele retorna um iterador em vez de uma lista.EDIT: Função recursiva multiplataforma:
Você pode agrupar o acima em uma função multiplataforma (Linux, Windows, Mac), para que você possa:
Aqui está a função:
fonte
Fácil e Rápido
Importe dois ou mais
csv
sem precisar fazer uma lista de nomes.fonte
usando um liner
map
, mas se você quiser especificar argumentos adicionais, poderá:Nota:
map
por si só não permite que você forneça argumentos adicionais.fonte
Se os vários arquivos csv estiverem compactados, você poderá usar o zipfile para ler todos e concatenar como abaixo:
fonte
Outro on-line com compreensão de lista que permite usar argumentos com read_csv.
fonte
Com base na boa resposta de @ Sid.
Antes de concatenar, você pode carregar arquivos csv em um dicionário intermediário que fornece acesso a cada conjunto de dados com base no nome do arquivo (no formulário
dict_of_df['filename.csv']
). Esse dicionário pode ajudá-lo a identificar problemas com formatos de dados heterogêneos, quando os nomes das colunas não estão alinhados, por exemplo.Importe módulos e localize caminhos de arquivo:
Nota:
OrderedDict
não é necessário, mas manterá a ordem dos arquivos que podem ser úteis para análise.Carregar arquivos CSV em um dicionário. Em seguida, concatene:
Chaves são nomes de arquivos
f
e valores são o conteúdo do quadro de dados dos arquivos csv. Em vez de usarf
como uma chave de dicionário, você também pode usaros.path.basename(f)
ou outros métodos os.path para reduzir o tamanho da chave no dicionário apenas para a parte menor que for relevante.fonte
Alternativa usando a
pathlib
biblioteca (geralmente preferidaos.path
).Este método evita o uso iterativo de pandas
concat()
/apped()
.Da documentação do pandas:
Vale a pena notar que concat () (e, portanto, append ()) faz uma cópia completa dos dados, e que a reutilização constante dessa função pode criar um impacto significativo no desempenho. Se você precisar usar a operação em vários conjuntos de dados, use uma compreensão da lista.
fonte
É assim que você pode usar o Colab no Google Drive
fonte
fonte