Me gustaría leer varios archivos csv de un directorio en pandas y concatenarlos en un gran DataFrame. Sin embargo, no he sido capaz de resolverlo. Esto es lo que tengo hasta ahora:
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)
Supongo que necesito ayuda dentro del bucle for???
Si tienes las mismas columnas en todos tus archivos csv
entonces puedes probar el siguiente código.
He añadido header=0
para que después de leer csv
primera fila se puede asignar como los nombres de las columnas.
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)
Una alternativa a 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
Editar: He buscado en Google mi camino en https://stackoverflow.com/a/21232849/186078. Sin embargo, últimamente estoy encontrando que es más rápido hacer cualquier manipulación usando numpy y luego asignarlo una vez al dataframe en lugar de manipular el propio dataframe de forma iterativa y parece que también funciona en esta solución.
Sinceramente, quiero que cualquiera que llegue a esta página considere este enfoque, pero no quiero adjuntar este enorme trozo de código como comentario y hacerlo menos legible.
Puedes aprovechar numpy para acelerar realmente la concatenación de los dataframes.
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"....]
Estadísticas de tiempo:
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 ---