Vorrei leggere diversi file csv da una directory in pandas e concatenarli in un grande DataFrame. Non sono stato in grado di capirlo però. Ecco cosa ho finora:
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)
Immagino di aver bisogno di aiuto all'interno del ciclo for?
Se hai le stesse colonne in tutti i tuoi file csv
allora puoi provare il codice qui sotto.
Ho aggiunto header=0
in modo che dopo aver letto csv
la prima riga possa essere assegnata come nome della colonna.
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)
Un'alternativa a darindaCoder'risposta:
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
Modifica: Ho cercato su Google la mia strada in https://stackoverflow.com/a/21232849/186078. Tuttavia di recente sto trovando più veloce fare qualsiasi manipolazione usando numpy e poi assegnandolo una volta al dataframe piuttosto che manipolare il dataframe stesso su base iterativa e sembra funzionare anche in questa soluzione.
Voglio sinceramente che chiunque colpisca questa pagina prenda in considerazione questo approccio, ma non voglio allegare questo enorme pezzo di codice come commento e renderlo meno leggibile.
È possibile sfruttare numpy per accelerare davvero la concatenazione dei 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"....]
Statistiche sui tempi:
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 ---