Importar múltiplos arquivos csv para pandas e concatenar em um único DataFrame

Eu gostaria de ler vários arquivos csv de um diretório em pandas e concatená-los em um grande DataFrame. Mas não consegui perceber isso. 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 alguma ajuda dentro do loop????

Solução

Se você tiver as mesmas colunas em todos os seus arquivos csv, então você pode tentar o código abaixo. Eu adicionei header=0 para que depois de ler csv a primeira linha possa ser atribuída como os nomes das colunas.

import pandas as pd
import glob

path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)
Comentários (5)

Uma alternativa ao darindaCoder's answer:

path = r'C:\DRO\DCL_rawdata_files'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent

df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)
# doesn't create a list, nor does it append to one
Comentários (2)

Edit: Eu pesquisei no Google https://stackoverflow.com/a/21232849/186078. No entanto, ultimamente estou achando mais rápido fazer qualquer manipulação usando o numpy e depois atribuí-lo uma vez ao dataframe em vez de manipular o próprio dataframe em uma base iterativa e parece funcionar nessa solução também.

Eu sinceramente quero que qualquer um que acesse esta página considere esta abordagem, mas don'não quero anexar este enorme pedaço de código como um comentário e torná-lo menos legível.

Você pode aproveitar o numpy para realmente acelerar a concatenação do dataframe.

import os
import glob
import pandas as pd
import numpy as np

path = "my_dir_full_path"
allFiles = glob.glob(os.path.join(path,"*.csv"))

np_array_list = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    np_array_list.append(df.as_matrix())

comb_np_array = np.vstack(np_array_list)
big_frame = pd.DataFrame(comb_np_array)

big_frame.columns = ["col1","col2"....]

Estatísticas de tempo:

total files :192
avg lines per file :8492
--approach 1 without numpy -- 8.248656988143921 seconds ---
total records old :1630571
--approach 2 with numpy -- 2.289292573928833 seconds ---
Comentários (4)