Ik wil graag verschillende csv bestanden uit een map in pandas inlezen en ze samenvoegen in één groot DataFrame. Ik ben er echter nog niet uit. Hier is wat ik tot nu toe heb:
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)
Ik denk dat ik wat hulp nodig heb binnen de for loop???
Als je dezelfde kolommen hebt in al je csv
bestanden dan kun je de onderstaande code proberen.
Ik heb header=0
toegevoegd zodat na het lezen van csv
de eerste rij kan worden toegewezen als de kolom namen.
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)
Een alternatief voor darindaCoder's antwoord:
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: ik googlede mijn weg in https://stackoverflow.com/a/21232849/186078. De laatste tijd vind ik het echter sneller om manipulatie uit te voeren met numpy en het dan eenmalig aan dataframe toe te wijzen in plaats van het dataframe zelf iteratief te manipuleren en het lijkt in deze oplossing ook te werken.
Ik wil oprecht dat iedereen die op deze pagina komt deze aanpak overweegt, maar wil dit enorme stuk code niet als commentaar bijvoegen en het minder leesbaar maken.
U kunt gebruik maken van numpy om echt te versnellen de dataframe concatenation.
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"....]
Timing statistieken:
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 ---