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????
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)
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
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 ---